Python 处理普通文件(flat file)
Python处理普通文件时,把数据从一个文件中读入内存,然后从内存写入文件。
使用open()打开文件
读写一个文件之前要打开它,格式如下:
fileobj = open(filename, mode)
• fileobj 是open() 返回的文件对象;
• filename 是该文件的字符串名;
• mode 是指明文件类型和操作的字符串。
mode的第一个字母表明对文件的操作类型:
• r 表示读模式。
• w 表示写模式。如果文件不存在则新创建,如果存在则重写新内容。
• x 表示在文件不存在的情况下新创建并写文件。
• a 表示如果文件存在,在文件末尾追加写内容。
mode的第二个字母表示要操作的文件的类型:
• t(或者省略)代表文本类型;
• b 代表二进制文件。
使用read()/readline()/readlines()读取文本文件
read()
使用read()函数能够一次性读取文件所有内容,如下:
>>> f_read = open('text2.txt','rt')
>>> content = f_read.read()
>>> print(content)
This is the first line
this is the second line
third line
...
Nth line
End.
>>> f_read.close()
>>>
需要注意的是,如果被读取的文件特别大(几个G),可能会出问题,因为它会尝试将几个G的文件内容一次性读入内存中。
可以设置read()每次读取的大小,如下:
>>> f1 = open('text2.txt','rt')
>>> chunk = 15
>>> text_content = ''
>>> while True:
part = f1.read(chunk)
if not part:
break
text_content += part
>>> f1.close()
>>> print(text_content)
This is the first line
this is the second line
third line
...
Nth line
End.
>>>
readline()
readline()每次只读入文件的一行,如下:
>>> with open('text2.txt','rt') as f1:
while True:
line = f1.readline()
if not line:
break
print(line)
This is the first line
this is the second line
third line
...
Nth line
End.
>>>
readlines()
readlines()函数调用时每次也是读取一行,但它返回的是单行字符串的列表,如下:
>>> with open('text2.txt','rt') as f1:
lines = f1.readlines()
>>> lines
[' This is the first line\n', 'this is the second line\n', 'third line\n', '...\n', 'Nth line\n', 'End.\n']
>>>
另外,最简单的读取文件的方式是通过迭代器,每次也会返回一行,如下:
>>> with open('text2.txt','rt') as f1:
for line in f1:
print(line)
This is the first line
this is the second line
third line
...
Nth line
End.
>>>
使用write()/print()写文本文件
write()可以返回写入文件的字节数。
>>> f_obj = open('test.txt','wt')
>>> f_obj.write("Hello world!!")
13
>>> f_obj.close()
>>>
会在python shell所在的目录生成一个test.txt文件,如下:

使用print()也可以写入文本,如下:
>>> f_obj2 = open('test2.txt','wt')
>>> print("this content is from print function",file=f_obj2)
>>> f_obj2.close()
>>>
使用wirte()和使用print()的区别
print()会默认在每个参数后面添加空格,在每行结束处添加换行。
如果文件已经存在,使用模式x可以避免重写文件,如下:
>>> f_obj = open('text2.txt','xt')
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
f_obj = open('text2.txt','xt')
FileExistsError: [Errno 17] File exists: 'text2.txt'
>>>
二进制文件读写
如果文件模式中采用了'b',那么文件会以二进制模式打开,这种情况下,读写的是字节而不是字符串。
二进制模式写入一个文件:
>>> fout = open('bfile', 'wb')
>>> fout.write(bdata)
256
>>> fout.close()
二进制模式读取一个文件:
>>> fin = open('bfile', 'rb')
>>> bdata = fin.read()
>>> len(bdata)
256
>>> fin.close()
seek() & tell()
Python在读写文件的过程中都会跟踪文件中光标的位置。使用函数seek()能够跳转到文件指定字节偏移量的位置。使用函数tell()能够返回光标距离文件开始处的字节偏移量。
其他操作
1 使用with 自动关闭文件
在完成对文件的读写操作后需要关闭文件。使用with的好处就是不需要使用close()来关闭文件。wih操作完成后文件会被自动关闭。
如下:
>>> with open('relativity', 'wt') as fout:
... fout.write(poem)
...
2 修改文件内容
修改文件内容,可以使用两个文件:原文件和临时文件,读取原文件的每一行,对符合要求的行做修改,并把每一行都写入临时文件中,最后使用临时文件覆盖掉原文件。
在使用os.rename的时候,如果目标文件已经存在的情况下,使用os.rename(临时文件,目标文件)时会报错(file exists)。所以,在使用os.rename之前先用os.remove()删除目标文件。
original_file='/home/test/test.o'
temp_file='/home/test/temp'
f_original=open(original_file,'r')
f_temp=open(temp_file,'w')
for line in f_original.readlines():
if keywork in line:
line=line.replace(line,'This is a new line')
f_temp.write(line)
f_temp.close()
f_original.close()
if os.path.isfile(original_file):
os.remove(original_file)
os.rename(temp_file,original_file)
3 处理Excel文件
处理Excel文件的话,需要模块xrld,可以在 https://pypi.python.org/pypi/xlrd 上下载安装。
打开Excel文件
excel_file='/home/test/list.xls' data = xlrd.open_workbook(excel_file) #打开 excel文件 table=data.sheets()[0] #获取第一个sheet
来源:https://www.cnblogs.com/cedrelaliu/p/5140213.html