这里将Python入门时遇到的一些坑记录下来。

Python 基础操作

打印

注意字符串的相加是合成一个新的字符串

print('1'+'1.5')

遍历(for 循环)

namelist = ['Enze Tang','Ziyin Cao','Linyang He','Bowen Hou']
for name in namelist:
        print(name,'is sitting with me.')

break 和 continue

break是将if条件执行后就结束循环,continue是将if条件执行后跳出当前循环继续下一轮循环

breakcontinuefor-else循环的混用。

for-else循环可以实现将所有条件遍历一遍再统一进行一个操作,else条件是在循环结束后被触发的,如果没有完整地进行循环,比如中途被break打断,则会跳出整个for-else循环,即不执行else语句。

for i in range(10):
    if i == 5:
        print('haha')
        break
else:
    print('循环完了')
# 输出结果为:haha

如果使用continue语句,则会将if-else条件执行完全。

for i in range(10):
    if i == 5:
        print('haha')
        continue
else:
    print('循环完了')
# 输出结果为:haha  循环完了

**注意for-elseelse要和for保持平齐,如果缩进则会变成if-else条件句。

for i in range(3):
    if i == 2:
        print('haha')
        continue
    else:
        print('循环中')
else:
    print('循环完了')
# 输出结果:
循环中
循环中
haha
循环完了

注意

  1. 遍历列表的时候列表自身没有被改变。
  2. 如果想要通过遍历改变列表,可以对列表进行切片复制赋上新名再遍历。

if 条件

条件三叉和三叉以上的时候使用 elif
条件处理的顺序也很重要,恰当的顺序可以有效的减少工作量。

方法一:

for n in range(1,101):
    if n % 3 == 0 and n % 5 != 0:
        print('fizz')
    elif n % 5 == 0 and n % 3 != 0:
        print('buzz')
    elif n % 5 == 0 and n % 3 == 0:
        print('fizzbuzz')
    else:
        print(n)

方法二:

for n in range(1,101):
    if n % 5 == 0 and n % 3 == 0:
        print('fizzbuzz')
    elif n % 3 == 0 :
        print('fizz')
    elif n % 5 == 0 :
        print('buzz')
    else:
        print(n)

range

range(a):从 0 到 a - 1
range(1,b):从 1 到 b - 1

.split('')

stringlist

' '.join()

liststring

index

liststring都可以被索引。
得到索引常用函数:enumerate

for i , index in enumerate(list):

字典操作

新建字典避免KeyError

letter_count = dict()
for word in  words:
     letter_count[letter] +=1
    # raises keyerror
     try:
         letter_count[letter] += 1
     except Keyerror:
         letter_count[letter] = 1
 ------另外一种方法------
 from collections import defaultdictionary
 letter_count = defaultdictionary(float)
 #里面填字典的数据类型
 -------另一种方法-------
 from collections import Counter
 letter_count = Counter()
 
 

文件操作

批量重命名

import os
print('Enter your file directory path here')
mypath = input()
# 要求用户输入要处理的文件目录地址
filelist = os.listdir(mypath)
for i in filelist:
    if i [-4:] == '.txt':
    # 挑选出需要处理的文件;文件后缀依据实际情况而定。
        i = os.rename(i,i[:-4]+'shamy'+'.txt')
        # 前面输入原名,后面输入修改名。

批量将Word文件转换为TXT文件

Word和TXT的编码形式是不同的,所以简单地将文档后缀进行修改只会得到乱码。所以批量将两者进行转换需要借助Word的另存为功能。

from win32com import client as wc
import os

print('Enter your Director\'s path:')
mypath = input()
all_FileNum = 0

def Translate(level, path):
    global all_FileNum
    # 该目录下所有文件的名字
    files = os.listdir(path)
    for f in files:
        if (f[0] == '~' or f[0] == '.'):
            continue
        new = path + '\\' + f
        print(new)
        # 除去后边的.docx后缀
        tmp = new[:-5]
        print(tmp)
        # 改成txt格式
        word = wc.Dispatch('Word.Application')
        doc = word.Documents.Open(new)
        doc.SaveAs(tmp + '.txt', 4)
        doc.Close()
        all_FileNum = all_FileNum + 1

if __name__ == '__main__':
    Translate(1, mypath)
    print('文件总数 = ', all_FileNum)

批量将word另存为其他文件

这个其实是对上面的一个扩展。

原理是利用win32com接口直接调用office API,好处是简单、兼容性好,只要office能处理的,python都可以处理,处理出来的结果和office word里面“另存为”一致。

只要给.SaveAs()的第二个参数输入不同的值,就可以将文件另存为不同类型。
常用的几种:

wdFormatDOSText = 4 
wdFormatHTML = 8 
wdFormatPDF = 17 
wdFormatXML = 11 

去除开头第一行的[]

path ='假装写好'
with open(path) as file:
    line = line.strip()
    if not line[0] :
        continue
# 只要不为空就一直执行
balabalalba        

迅速读取文档

readlines()

f.readlines()会自动将文件的每一行以字符串的形式读取存入列表,这样的效率会比f.readline()的效率要高。但是并不能用此函数一下子得到我们想要的列表。所以使用遍历将存入列表的数据进行处理。

path = '假装写好'
f= open(path)
newlist = []
for line in f.readlines():
    line = line.strip()
    newlist.append(line)

或者更简洁地使用列表表达式来写。

path = '假装写好'
f= open(path)
newlist = [line for line in f.readlines() line = line.strip]

strip()只是整理数据的一个例子,具体的整理的方法要按照实际情况来选择合适的对字符串的处理方式来定。