MyPython-->进阶篇-->文件操作
从文件中读取数据
文本文件可以储存的数据量多的难以置信,每当需要分析和修改存储在文件中的信息时,读取文件都会很有用,对数据分析应用程序来说尤其如此。
例如 你可以读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能显示这些内容
读取整个文件
先创建一个文件
pi_digits.txt
with open('pi_digits.txt') as file_objecct: contents = file_objecct.read() print(contents)
要以任何方式使用文件 哪怕仅仅是打印其内容,都要先打开文件,这样才能访问他。函数open()接受一个参数:要打开文件的名称。python在当前执行的文件所在的目录,中查找指定文件。open()函数返回一个表示文件的对象,储存在后面的别名内
关键字with在不需要访问文件后将其关闭。在这个程序中我们调用了open()而没调用close(),我们也可以通过open() close()开关文件,但是如果存在bug导致close语句未执行,文件将不会关闭,未妥善关闭可能会导致数据丢失或者文件受损,过早调用又回发现要用的时候已将关闭了,这会导致更多的错误。 可以使用with关键字,让python在合适的时候自动关闭文件。
我们创建好了 pi_digits.txt 的文件对象后我们可以使用read()方法读取这个文件的全部内容,并将其作为一个长长的字符串储存在变量中
如果后面有空行可使用rstirp方法删除后面空行
文件路径
我们可以使用相对路径和绝对路径
绝对路径可以读取系统任何地方的文件,就目前而言最简单的做法是放到程序所在目录下,或子目录下。 windows 路径用\
逐行读取
我么可能会对每一行数据进行检查,可对文件对象使用for循环
filename = 'pi_digits.txt' with open(filename) as file_objecct: for line in file_objecct: print(line.rstrip())
我们队文件对象执行循环来遍历文件中的每一行
rstrip用于消除每行打印的空行
创建一个包含文件各行内容的列表
使用关键字with时,open返回的文件对象只在with代码块内使用,如果要在代码块外访问文件的内容,可以在with代码块中将文件的各行储存在一个列表中,并在with代码块外使用该列表,可以立即处理文件的各个部分,也可推迟到程序后面再处理
with open(filename) as file_objecct: line1 = file_objecct.readlines() print(type(file_objecct.readlines())) for line in line1: print(line.rstrip())
readlines()方法返回的是一个列表,列表别储存在变量中。
使用文件的内容
将文件内的圆周率保存下来且没有空格
filename = 'pi_digits.txt' with open(filename) as file_object: l1 = file_object.readlines() pi = '' for x in l1: pi+=x.strip() print(pi)
读取文本文件时,python将其中所有的文本都解读为字符串,如果你读取的是数字,而且要将其作为数值使用,可以使用int()方法转换为整数,或使用float()转换为浮点数
with open('pi.txt') as file_object: f = file_object.read() f1 = ''.join(f.split(' ')) print(f1)
由于文件中存在大量空格,切没换行我们通过read()方法获得通过split()方法去除空格
圆周率中包含你的生日
1 with open('pi.txt') as file_object: 2 contents = file_object.readlines() 3 contents_str = '' 4 for line in contents: 5 contents_str += ''.join(line.split(' ')) 6 contents_str = contents_str.strip() 7 print(contents_str) 8 while 1: 9 birthday_str = input('enter your birthday in pi enter q exit') 10 birthday_num = contents_str.find(birthday_str) 11 if birthday_str == 'q': 12 break 13 elif birthday_num != -1: 14 birthday_num+=1 15 print('in pi %s'%birthday_num) 16 else: 17 print('不存在')
判断输入的字符是否在文件里有的话返回位置
写入文件
保存数据最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序程序输出的中断窗口,这些输出也依然存在,可以在程序结束运行后查看这些输出,可与被人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。
要将文本写入文件,你在调用open()时需要提供另一个实参,告诉python你要写入打开的文件。我们将一条简单的消息储存到文件中
filename = 'writetest.txt' with open(filename,'w') as file_object: file_object.write('I Love my country')
在以上实例当中,调用open()方法提供了两个实参。第一个实参也是要打开的文件的名称,第二个实参是告诉python,我们要以写入模式打开这个文件。
读取模式 ('r') 写入模式('w') 附加模式('a') 读取和写入文件('r+'),如果省略了模式实参,将以默认的制度模式打开文件
如果你要写入的文件不存在,函数open()将自动创建他。然而以写入('w')模式打开文件要十分小心,如果指定文件已经存在 python将在返回对象前清空该文件!
执行完上述代码会自动生成一个writetest.txt文件,并写入 I Love my country,如果当前目录下有该文件,原内容会被清空再写入文字
注意read()方法可以一次读取文件的全部内容,python把内容读到内存,为防止文件太大我么可以提供参数,这次读取几个位置
filename = 'writetest.txt'# 文本内容是 for the lichking with open(filename) as filename: contents = filename.read(2)#fo content = filename.read(5)# r the print(contents) print(content)
以上代码可以看出,read()函数内提供一次读多少,并且下次读是从上次结束的地方开始而不是从头开始
写入多行
函数write()不包含换行我们需要自己加入
with open(filename,'w') as file_object: file_object.write('I Love my country\n') file_object.write('I Love freedom\n') with open(filename) as file_object: contents = file_object.read() print(contents)
加入了换行符,也可以加入制表符空格啊
附加到文件
如果你要给文件添加内容而不是覆盖原有的内容,可以 附加模式 打开文件。你以附件模式打开文件时,python不会再返回对象前清空文件,而你写入到文件的行都将添加到文件末尾,如果指定文件不存在将自动创建一个空文件
filename = 'writetest.txt' with open(filename,'a') as file_object: file_object.write('for the lichking \n') with open(filename) as file_object: contents = file_object.read() print(contents)
附加模式'a' 打开,写入到文件的都加被添加到文件末尾
二进制文件
前面讲的都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片视频等用'rb' 模式打开文件即可
f = open('test.jpg','rb')
f.read() #返回十六进制的字节
字符编码
要读取非UTG-8的文本文件,需要给open()函数传入encoding参数,例如读取gbk文件
f = open(gbk.txt,encoding = 'gbk') f.read()
遇到有些编码不规范的文件,可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符,遇到这种清理,open()函数还接受一个errors参数,表示如果遇到编码错误后如何处理,最简单的方式是直接忽略:
f = open('test.txt',encoding = 'gbk', errors='ignore')
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。