python3读取csv文件所提供的简便方法
方法 | 含义 |
reader() | 按行读取,返回值是一个迭代对象 |
DictReader() | 读取结果生成一个dict |
csv.writer() | 以元组的方式写入 |
csv.DictWriter() | 以字典的形式写入 |
import csv def read_csv_demo1(): with open("china_smoking.csv", "r") as fp: # reader是一个迭代器 reader = csv.reader(fp) # 如果不需要输出标题,可以next()方法,把迭代器往下挪 next(reader) # 这样通过下标的方式去获取 for x in reader: Location = x[1] smoking_yes_cancer_yes = x[2] print({"Location":Location,"smoking_yes_cancer_yes":smoking_yes_cancer_yes}) read_csv_demo1()
import csv def writer_csv_demo1(): headers = ["name","age","height"] values = [ ("小王",18,178), ("小张",20,180), ("小李",17,166) ] with open("classroom.csv","w",encoding="utf-8",newline="") as fp: writer = csv.writer(fp) writer.writerow(headers) writer.writerows(values) writer_csv_demo1()
def writer_csv_demo2(): headers = ["name", "age", "height"] values = [ {"name":"小王","age":18,"height":178}, {"name":"小王","age":18,"height":178}, {"name":"小王","age":18,"height":178} ] with open("classromm2.csv","w", encoding="utf-8",newline="") as fp: # 使用csv.DictWriter()方法,需传入两个个参数,第一个为对象,第二个为文件的title writer = csv.DictWriter(fp,headers) # 使用此方法,写入表头 writer.writeheader() writer.writerows(values) writer_csv_demo2()
参数 | 含义 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。 |
w | 打开一个文件只用于写入。若文件存在则将其覆盖,若文件不存在,则创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
f = open( '/Users/michael/test.txt', 'r' )
- r 表示读取文件,我们就成功地打开了一个文件
- 若如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在,错误情况如下:
f=open('/Users/michael/notfound.txt', 'r') Traceback (most recent call last): File "", line 1, in FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'
如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示: f.read() 'Hello, world!'
最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的: f.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现: try: f = open('/path/to/file', 'r') print(f.read()) finally: if f: f.close()
方法 | 含义 |
f.read() | 读取全部文件内容 |
f.read(size) | 每次读取size个字节内容 |
f.readline() | 每次读取一行的内容 |
f.readlines() | 读取全部内容,但结果返回list,每行内容是一个元素 |
with open( '/path/to/file', 'r' ) as f: print( f.read() ) # 这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法 如果遇到超大文件,需要注意:
for line in f.readlines(): print( line.strip() ) # 读取文件之后,文字末尾会出现'n' # strip() 函数中可以把目标内容line里面所有的空格,空行等都删除掉,只剩余文字内容
with open(file_path, 'r', encoding='utf-8-sig') as f: next(f) # 最终读取到的内容,直接跳过第一行了 all_line_list = f.readlines()
open函数使用注意地方:
f = open('/Users/michael/test.txt', 'w') f.write('Hello, world!') f.close()
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码字符编码 写入文件时需要添加encoding='utf-8'参数,这样可以防止写入中文不乱码 with open('/Users/michael/test.txt', 'w',encoding='utf-8') as f: f.write('Hello, world!')
with open("test.csv", "a", newline="") as csvfile: rows = ("商品名称", "商品价格", "商品链接") writer = csv.writer(csvfile) writer.writerow(rows)
读取文件内每一行的内容,然后将每一行的内容通过split获取特定的结果 with open(path,"r",encoding="utf-8") as number: lines = number.readlines() j = 0 for line in lines: try: temp = line.split(name) t = temp[1].split(':') ack1 = t[1].split(",") ack2 = t[2].split(",") ack3 = t[3].split("}") except: continue step.append(j) j = j + 1 ack_1.append(int(ack1[0])) ack_2.append(int(ack2[0])) ack_3.append(int(ack3[0]))
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件: with open('/Users/michael/gbk.txt', 'r', encoding='gbk') as f: f.read()
with open('/Users/michael/gbk.txt', 'r', encoding='gbk',errors='ignore') as f: f.read() 前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用’rb’模式打开文件即可: with open('/Users/michael/test.jpg', 'rb') as f: f.read() # b'xffxd8xffxe1x00x18Exifx00x00...' 十六进制表示的字节
Python全局变量是指其有效范围为整个程序空间。在程序的任何一个地方都可以访问这个变量,不管是在函数内部还是函数外部。
def myFunction(): print('Inside myFunction(): ',myVar) myFunction() myVar = 'hello python - global' print('Outside myFunction(): ',myVar) 运行结果: 运行将报告错误:NameError: name 'myVar' is not defined
myVar = 'hello python - global' def myFunction(): myVar = 'hello python - local' print('Inside myFunction(): ',myVar) myFunction() print('Outside myFunction(): ',myVar) 运行结果: Inside myFunction(): hello python - local Outside myFunction(): hello python - global
#若想在一个函数内部对全局变量赋值更新,可以用global关键字明确地告知python myVar = 'hello python - global' def myFunction(): global myVar myVar = 'hello python - I changed you inside myFunction' print('Inside myFunction(): ',myVar) myFunction() print('Outside myFunction(): ',myVar) 运行结果: Inside myFunction(): hello python - I changed you inside myFunction Outside myFunction(): hello python - I changed you inside myFunction
在python中,一个源代码文件可以看作是一个模块(module)。在一个模块中声明了一个全局变量后,只要把前一个模块import后,就可以在另一个模块中查看前一个模块的全局变量了。 myVar = 'hello python - global, in python_global_1 module' def myFunction1(): global myVar myVar = 'hello python - I changed you inside myFunction' print('Inside myFunction(): ',myVar) from python_global_1 import * def myFunction(): print('Inside myFunction(): ',myVar) myFunction() print('Outside myFunction(): ',myVar) 运行结果: Inside myFunction(): hello python - global, in python_global_1 module Outside myFunction(): hello python - global, in python_global_1 module