python中对文件的读写操作,python对文件进行读写操作
Python文件对象提供了三种“读取”方法:read()、readline()和readlines()。每个方法都可以接受一个变量来限制每次读取的数据量。本文主要介绍python文件读写的一个总结。有需要的朋友可以参考一下。
00-1010 open()的读写文件模式参数:file _ obj.seek (offset,when=0)字符编码
目录
用Open()方法打开一个文件(open()返回一个file对象,它是迭代的):
f=打开( test.txt , r )
r是文本文件,rb是二进制文件。(该模式参数的默认值为r)
如果文件不存在,open()函数会抛出一个IOError错误,并给出一个错误代码和详细信息告诉你文件不存在:
f=打开( test.txt , r )
回溯(最近呼叫):
模块中文件 stdin 的第1行
FileNotFoundError: [Errno 2]没有此类文件或目录: test.txt
文件使用后必须关闭,因为文件对象会占用操作系统的资源,操作系统同时打开的文件数量是有限的。
f.close()
由于IOError可能在文件读写时发生,一旦发生错误,下面的f.close()将不会被调用。所以,为了确保文件无论是否有错误都能被正确关闭,我们可以使用try.最终实现:
尝试:
f=打开(/path/to/file , r )
打印(f.read())
最后:
如果f:
f.close()
但是每次都这样写太繁琐了,所以Python引入了with语句为我们自动调用close()方法:
用open(/path/to/file , r )作为f:
打印(f.read())
Python文件对象提供了三种“读取”方法:read()、readline()和readlines()。每个方法都可以接受一个变量来限制每次读取的数据量。
Read()每次读取整个文件时,通常用来将文件的内容放入一个字符串变量中。如果文件大于可用内存,为了安全起见,可以重复调用read(size)方法来读取最多size字节的内容。readlines()的区别在于后者一次读取整个文件,比如。阅读()。readlines()自动将文件内容分析成一个行列表,可以由Python的for.在.结构。Readline()一次只读取一行,通常比readlines()慢很多。Readline()应该只在没有足够的内存来一次读取整个文件时使用。注意:这三种方法都是读入每行末尾的 \n 。默认情况下,它不会删除“\n”,因此我们需要手动删除它。
在[2]:中用open(test1.txt , r )作为f1:
list1=f1.readlines()
在[3]:列表1中
Out[3]: [111\n , 222\n , 333\n , 444\n , 555\n , 666\n]
删除 \n
在[4]:中用open(test1.txt , r )作为f1:
list1=f1.readlines()
对于范围(0,len(list1)):中的I
列表1[i]=列表1[i]。rstrip(\n )
In[5]: list1
Out[5]: [111, 222, 333, 444, 555, 666]
对于read()和readline()也是把'\n'读入了,但是print的时候可以正常显示(因为print里的'\n'被认为是换行的意思)
In[7]: with open(test1.txt, r) as f1:list1 = f1.read()
In[8]: list1
Out[8]: 111\n222\n333\n444\n555\n666\n
In[9]: print(list1)
111
222
333
444
555
666
In[10]: with open(test1.txt, r) as f1:
list1 = f1.readline()
In[11]: list1
Out[11]: 111\n
In[12]: print(list1)
111
一个python面试题的例子:
有两个文件,每个都有很多行ip地址,求出两个文件中相同的ip地址:
# coding:utf-8import bisect
with open(test1.txt, r) as f1:
list1 = f1.readlines()
for i in range(0, len(list1)):
list1[i] = list1[i].strip(\n)
with open(test2.txt, r) as f2:
list2 = f2.readlines()
for i in range(0, len(list2)):
list2[i] = list2[i].strip(\n)
list2.sort()
length_2 = len(list2)
same_data = []
for i in list1:
pos = bisect.bisect_left(list2, i)
if pos < len(list2) and list2[pos] == i:
same_data.append(i)
same_data = list(set(same_data))
print(same_data)
要点就是:(1)用with (2)处理行末的'\n' (3)使用二分查找提高算法效率。(4)使用set快速去重。
写文件
写文件和读文件是一样的,唯一区别是调用open()
函数时,传入标识符'w'
或者'wb'
表示写文本文件或写二进制文件:
>>> f = open(test.txt, w) # 若是wb就表示写二进制文件>>> f.write(Hello, world!)
>>> f.close()
注意:'w'这个模式是酱紫:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西。所以若不想清空原来的内容而是直接在后面追加新的内容,就用'a'这个模式。
我们可以反复调用write()
来写入文件,但是务必要调用f.close()
来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with
语句来得保险:
with open(test.txt, w) as f:f.write(Hello, world!)
python文件对象提供了两个写方法: write()和 writelines()。
- write()方法和read()、readline()方法对应,是将字符串写入到文件中。
- writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
f1 = open(test1.txt, w)f1.writelines(["1", "2", "3"])
# 此时test1.txt的内容为:123
f1 = open(test1.txt, w)
f1.writelines(["1\n", "2\n", "3\n"])
# 此时test1.txt的内容为:
# 1
# 2
# 3
关于open()的mode参数:
'r':读
'w':写
'a':追加
'r+' == r+w(可读可写,文件若不存在就报错(IOError))
'w+' == w+r(可读可写,文件若不存在就创建)
'a+' ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就好啦:
'rb''wb''ab''rb+''wb+''ab+'
file_obj.seek(offset,whence=0)
file_obj.seek(offset,whence=0)方法用来在文件中移动文件指针。offset表示偏移多少。可选参数whence表示从哪里开始偏移,默认是0为文件开头,1为当前位置,2为文件尾部。举例:
f = open("test1.txt", "a+")print(f.read())
f.write(1)
f.seek(0, 0)# 把文件指针从末尾移到开头,没有这句话下面的read()就读不到正确的东西
print(f.read())
f.close()
注意:这个文件指针的改变只是作用于'r',对'w'和'a'不会起作用,如果是'w',那么write()永远都是从开头写(会覆盖后面对应位置的内容),是'a'的话write()就永远都是从最后开始追加。
字符编码
要读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,例如,读取GBK编码的文件:
>>> f = open(test.txt, r, encoding=gbk)>>> f.read()
测试
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError
,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()
函数还接收一个errors
参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open(test.txt, r, encoding=gbk, errors=ignore)
到此这篇关于python文件读写操作小结的文章就介绍到这了,更多相关python文件读写内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。