python基础--文件的操作

为什么要用文件来操作数据?
在cmd下操作时,变量是放在内存中使用的,如果cmd一旦关闭变量就没有了下次就无法继续使用,所以就有了文件存在的意义。
数据的保存:
1 内存:常用的变量都是在内存里面的
2 文件:文本内容、二进制的文件内容
3 数据库:保存
 
 
操作文件的流程:
1 要读取的文件,路径一定要存在。
2 打开存在的文件:open函数 
  参数1:文件的路径,相对的,绝对的
  参数2:打开文件的模式,r\w\a
  编码:encoding="utf-8"
3 操作文件的内容,读、写(把原有内容清空在写)、追加
(原有内容不变,在它的最后面写上新的内容)
4 文件关闭掉。
 
 
D盘新建a.txt文件(新建文件的时候,默认保存是ansi编码(gbk),然后也可以选择utf-8。)
a.txt
什么1111
fef
光荣之路

#判断文件在不在

>>> import os.path  #引入路径判断的包
#判断文件在不在用exists
>>> os.path.exists("d:\\a.txt")   #绝对路径
True
>>> os.path.exists(r"d:\a.txt")  #文件路径写\\,或者\前面加r
True
>>> os.path.exists("a.txt")   #相对路径
False
>>>
>>> if os.path.exists("d:\\a.txt"):
...     print("文件存在可以操作")
...
文件存在可以操作
>>>
绝对路径:从盘符开始完整的路径,, 例如:e:\test\test1\a.txt
相对路径:在当前的目录下,以它为根目录,使用相对路径进行查找,,例如:在e:\test\test1盘下执行py程序,程序里面使用了相对路径a.txt; 那么它对应的绝对路径: e:\test\test1\a.txt

>>> os.getcwd()  #获取当前所在路径
'C:\\Users\\dell'
>>>
 
 
#打开文件
>>> fp =open(r"d:\a.txt","r",encoding="utf-8")   #打开文件,有三个常用的参数,fp是文件句柄
#open函数,如果没有写模式,
#默认是r模式,也就是读模式
#没有写编码,那么就是gbk
>>> fp   #句柄:指向磁盘文件在内存或者磁盘上的位置指针
<_io.TextIOWrapper name='d:\\a.txt' mode='r' encoding='utf-8'>
>>> dir(fp)
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']
>>> fp.read()  #read读取全部文件内容
''
>>> fp.seek(0,0)  #上一步已经读取了文件,文件的游标会指到文件的最末尾,如果想再次读取文件内容需要用seek将文件游标返回到文件最开始的位置
0 
>>> fp.read()
'1111\nfef\n光荣之路'
>>> fp.close()  #关闭文件

为什么一定要关闭文件?

  • 文件不关闭,写入的内容太少,实际写的内容并不会立刻写到磁盘,其他文件操作可能会受限。
  • 写入场景:一次写不多的内容,比如:100个字操作系统会把内容存在内存,不写入文件。

                      什么时候写入呢?
                     要等待写入的内容到一定量,64k才会写入。
                     fp.fluse() #立刻写入文件的方法
                     close之后,就会把所有待写入的内容保存到文件中

程序中不close会有什么影响:
1 python程序在执行完毕了,会自动close.
2 对于服务器端,不close,可能造成数据不真,正写入到文件里
3 对于服务器端,每次打开一个文件都不close
会把文件句柄(node)占用光.操作系统上打开文件是
有限制:65535个。达到65535个node被占用的时候
操作系统就死掉了,句柄耗尽。
 
结论:读写文件一定要close
问题:服务器端的程序是一直在执行?还是一会儿执行一会儿不执行?
服务器端的服务宗旨:尽管你可能不来,但是我们一定死等。
 
fp.read():读取文件的全部内容
>>> fp.readline()   #readline每次读一行
'1111\n'
>>>
数据量大:readline()
优点:省内存
缺点:速度慢
数据量不大:read()把数据读到内存,
优点:操作起来很快,速度快
缺点:占内存

>>> fp.seek(0,0)
0
>>> fp.read(1)   #只读一个字
''
>>> fp.tell()   #tell告诉你文件游标所在位置,读取的是字节数
3 


#我想指定读哪一行怎么办?
>>> fp.seek(0,0)
0
>>> fp.readlines()   #readlines()读取每一行放列表里
['什么1111\n', 'fef\n', '光荣之路']
>>> fp.seek(0,0)
0
>>> lines =fp.readlines()
>>> lines[1]  #然后在用坐标取
'fef\n'
>>> lines[0]
'什么1111\n'
>>>


不允许使用readlines,请计算一个文件的行数
#遍历读所有内文件的内容的方式:
>>> fp.seek(0,0)
0
>>> for line in fp:
...     print(line,end="")
...
什么1111
fef
光荣之路>>>
>>> fp.seek(0,0)
0
>>> count =0
>>> for line in fp:
...     count +=1
...
>>> count
3
while实现:
>>> count =0
>>> while fp.readline():
...     count+=1
...
>>> print(count)
5
#写文件
>>> fp =open("d:\\a.txt","w",encoding="utf-8")
>>> fp.write(1111)   #写入文件内容必须是字符串,否则报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not int
>>> fp.write("123456")
6
>>> fp.flush()  #用flush主动写入,或者close文件自动写入
>>>

#插入
#思路:先读取要插入位置的前面部分,在读取要插入位置的后面部分,然后把三部分拼接写入
#实现: >>> fp = open("e:\\a.txt","r+",encoding="utf-8") >>> two_word=fp.read(2) >>> two_word '光荣' >>> last_two_word=fp.read(2) >>> last_two_word '之路' >>> fp.seek(0,0) 0 >>> fp.write(two_word+"gr"+last_two_word) 6 >>> fp.close() >>> #写入的模式 w+:清空原有内容后,进行读写的模式 r+:保留原有内容后,进行读写的模式 a+:保留原有内容后,进行读写的模式 且写入内容永远在文件的最后一行
 

猜你喜欢

转载自www.cnblogs.com/wenm1128/p/11622075.html