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+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

 

posted @ 2016-08-31 18:45  notJoke  阅读(321)  评论(0编辑  收藏  举报