python基础之文件总结(一)

我们在使用python进行编程,不是所有的数据都是保存在内存里的,更多的情况是保存在磁盘内的文件里的。因此,要想调用数据进行计算,就必须掌握在python中如何对文件里的数据进行读写。

我们可以通过open()来创建、读取、写入文件。help(open),可以看到open()函数的定义如下:
open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
通过观察,我们可以知道,open()函数有一个必须要给定的形参——file,即文件名。其他的参数都是默认参数,除了mode外,基本上都不需要修改。通过设置mode,我们可以设置mode的模式。

具体的,mode可以设置为以下类型:
‘w’ 以写入的方式打开文件,会覆盖已存在的文件
‘x’ 如果文件已经存在,使用此模式打开将引发异常
‘r’ 以只读方式打开文件(默认)
‘a’ 以写入模式打开,如果文件存在,则在末尾追加写入
‘b’ 以二进制模式打开文件
‘t’ 以文本模式打开(默认)
‘+’ 可读写模式(可添加到其他模式中使用)
‘U’ 通用换行符支持

与此同时,我们还可以通过一些文件对象方法,实现具体的文件读取、写入功能

文件对象方法 执行操作
f.close() 关闭文件
f.read([size=-1]) 从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回
f.readline([size=-1]) 从文件中读取并返回一行(包括行结束符),如果有size有定义则返回size个字符。可先生成列表,再迭代读取。
f.write(str) 将字符串str写入文件
f.writelines(seq) 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象
f.seek(offset, from) 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节
f.tell() 返回当前在文件中的位置
f.truncate([size=file.tell()]) 截取文件到size个字节,默认是截取到文件指针当前位置

创建一个文件

>>> new_file_name ='D:\\new_file.txt'
>>> file =open(new_file_name,'w')

注意:
1、这里写的是绝对路径,可以指定磁盘某一个路经创建文件。但如果只写:new_file_name =’new_file.txt’,也即相对路径,表示在代码文件所在目录创建一个新文件。
2、这里创建文件是以覆盖的形式创建的,即如果文件已经存在,再创建一个同名文件,则会覆盖之前的文件。所以若文件内已经存在内容的情况下,千万要注意。

读取一个文件
在此之前,我们要在new_file.txt里面手动输入一些内容
这里写图片描述
读取文件内的数据,我们要用到f.read()方法或者f.readline()方法。上面有详细介绍。

f = open('D:\\new_file.txt','r')#以只读的方式打开文件
file = f.read()   #使用read()函数,将读取的数据以字符串的形式放到file里
str1 = ''
for each_line in file:#将文件里的英文字母进行拼接成一个长字符串。
         str1 +=each_line
print(str1)

#输出结果是:This is a new file,you can read it by order.

对文件进行写入
我们更多的应用’a’模式,对文件内容进行新增。我们要使用文件的两种方法。一种是f.write(str),将字符串添加到文件中去;一种是f.writelines(seq),将序列seq中的字符串添加到文件中去。为了使添加进去的数据实现换行,我们可以手动加入换行符’\n’,或者对序列进行一个预处理。

>>> f = open('D:\\new_file.txt','a')

>>> f.write('\n'+'猫咪非常可爱'+'\n')

7
>>> tuple1 =(('小狗也很可爱','小老鼠一点都不可爱'))

>>> tuple1 =(line + '\n' for line in tuple1)

>>> f.writelines(tuples)

>>> f.writelines(tuple1)

>>> f.close()

注意:对文件写入后,一定要f.close()关闭文件,才能真正保存写入的信息。因为f.close()之前,写入的信息是保存在内存中的,只有文件关闭之后,才会将信息从内存读取到磁盘中保存。

文件写入和读取中的指针问题
f.seek(),f.tell()方法就是专门用于对文件指针进行操作。对于文件写入,从文件的哪个位置写入,这是一个问题。对于文件读取,从文件的哪个位置开始读取,也是一个问题。因此,python 中通过指针来表示写入和读取的位置。

f.seek(offset, from) 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节
f.tell() 返回当前在文件中的位置

>>> f = open('D:\\new_file.txt','r')

>>> f.tell()

0
>>> f.read(5)

'This '
>>> f.tell()

5

>>> f.seek(7,0)

7

文件的二进制读取
从文件里读取字符串是非常简单的,但是要是想读取数值就比较麻烦了,比如说序列。从文本文件里读取序列,可以先将其每一项转化为字符串读取,但是想要把字符串恢复到文本文件里的序列,就非常繁琐了。
但好在python提供了一个非常好用的模块,利用这个模块,我们就能很容易将序列、字典、集合这类复杂的数据类型转化为二进制文件。对这个二进制文件,无论是读取还是恢复都是很容易的。
这个模块就是pickle。通过pickle.dump(seq,file)。我们可以把序列写入二进制文件file中。通过pickle.load(file),我们可以从文件中恢复序列。但前提是,文件的写入mode是’wb’,文件的读取mode是’rb’。
在实际编程中,遇到大量复杂的字典列表,pickle模块非常有用,对于简化代码非常有用。

>>> my_list = [123, 3.14, '列表',(2, 3, 'one')]

>>> pickle_file = open('my_list.pkl','wb')

>>> import pickle

>>> pickle.dump(my_list,pickle_file)

>>> pickle.close()

Traceback (most recent call last):
  File "<pyshell#50>", line 1, in <module>
    pickle.close()
AttributeError: module 'pickle' has no attribute 'close'
>>> pickle_file.close()

>>> pickle_file = open('my_list.pkl','rb')

>>> my_list2 =pickle.load(pickle_file)

>>> my_list2

[123, 3.14, '列表', (2, 3, 'one')]

猜你喜欢

转载自blog.csdn.net/weixin_42920648/article/details/81702510