Python —— 文件处理

1、文件操作分为读、写、修改

  两种方式读写文件:

  方法1:

1 f = open(file = '路径', mode = 'r', encoding = 'utf-8')
2 data = f.read()
3 f.close()

 

  方法2:

1 with open(‘路径’,‘r’,encoding = 'utf-8') as f:
2      f.read()


2、以什么方式存的文件,就要用什么方式打开,必须指定,否则会出现编码错误,所以在open里面要写上encoding

 

3、路径

  相对路径

  绝对路径

4、二进制模式

  在不知道文件使用什么编码的情况下,要打开文件,可以使用二进制模式打开:

1 f = open(file = '路径', mode = 'rb')
2 data = f.read()   # f.read(1) 读1个字符
3 print(data)
4 f.close()

 

 5、智能检测编码工具:

   要判断文件到底使用哪种方式编码的(一般就是utf-8、Unicode、gbk)

   需要使用第三方模块: chardet, 根据编码的规律(不同编码的字节)

# -*- coding:utf -8-*-
import chardet
f = open('hello', 'rb')
data = f.read()
f.close()
result = chardet.detect(data)
print(result)

out:
{'encoding': 'IBM855', 'confidence': 0.20479192628309825, 'language': 'Russian'}

 

   安装方法:pip

  打开终端,输入pip install chardet  (要在pip已经成功安装在电脑上才行)

  编码和解码:

  编码 encode  使用一个编码方式进行编码或者打开

  unicode ----> encode 编码 -----> gbk\ utf-8  当内存里的数据要存储或者传输的时候用utf-8 保存

  解码 decode 

  utf- 8  ----> decode 解码 ---->  unicode   当硬盘的数据加载到内存中读取的时候,使用Unicode 读取

  

 

6、写模式操作文件 w\ wb

  如果文件很大,在不占内存的情况下,处理完文件,可以进行边读边处理,把整个文件每次读一点,循环读完整个文件

# 循环语句读文件
f = open('file','r') for line in f: print(line) # print会自动换行,所以打印出来会空一行打印

 

  print 具有打印完后,自动换行的功能

  写文件:

f = open('younggirl', 'w', encoding='utf-8') # 使用w ,会自动创建这个文件
# 文件编码是utf-8 ,加载到内存后,是自动转换成Unicode 读取
f.write('today is monday')
f.write('tomorrow is tuesday')  # write 是不会自己换行的   
f.close()

   创建一个二进制的文件,写内容的时候 要标志编码类型,才能顺利写入:

7、追加模式 a \ ab :把文件追加到文件尾部:

1 f = open('file', mode = 'a', encoding = 'gbk')

 

8、文件读、写混合模式(r+):先读后写

f = open(file='hello1', mode='r+', encoding='gbk')
print(f1.read())
f.write('\nahhahah')
f.write('\n111111')
print(f.read())
f1.close()
只会打印第一个print,因为先读 后写,写完之后,文件中的光标已经在最后一个,再读的话,已经没有内容可读了

 

9、文件写、读模式(w+):先清空,后写入内容

 

10、文件处理的其他功能:

  fileno:

  返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到

 

  flush:

  把文件从内存buffer里强制刷新到硬盘

  在内存里写入文件的时候,没有真正的写到文件中,只有close,才会存入

  当内存的buffer满了之后,才会自动刷到硬盘

  如果要强制刷入硬盘,可以中间用flush

 

  readable:

  判断是否可读

  •   在Linux中,一切皆文件(连一个安装包、视频、终端都是文件)所以要判断文件是否可读才能正常读取
  •   当文件是w模式的时候,是不能读取文件的

  

  readline:

  只读一行内容,遇到\n 、 \r 结束读取

    \r前面的字符不打印,后面的才打印

    \n打印前面的字符

 

  seek:

  把操作文件的光标移动到指定位置

  f.seek(10): 长度是按照字节算的,但是不同的字符编码所占用的字节长度是不一样的,当不知道字符编码的时候,错用seek,会出现乱码

  

f = open('blue', 'r+', encoding='utf-8')
f.seek(15)
f.write('aaa')
f.close()

 

  

 

  seekable:判断是否可移动

 

  tell:

  读取当前光标的位置(字节的长度)

  

  truncate:

  按指定长度截断文件,从当前位置往后面删除

  

1 f = open('blue', 'r+', encoding='utf-8')
2 f.truncate(20)
3 f.close()

  

11、修改文件

  使用seek,把光标移动到文件的中间

  

f = open('blue', 'r+', encoding='utf-8')
f.seek(6)
f.write('用seek插入字符')
f.close()

  以上问题: 把有一些内容被替换掉了,没有直接插入,

  还有可能会出现乱码(输入字节3个的话,剩下的多了一个出来,就乱码了) 这个和存储原理导致的  

  

   解决方法:

  方法1: 占硬盘方式的文件修改代码

  要边读边修改,写到新的文件里

  

f = 'blue'
f_new = '{}.new'.format(f)
old_str = 'how'
new_str = 'how222.how'
file = open(f, 'r', encoding='utf-8')
file_new = open(f_new, 'w', encoding='utf-8')
for line in file:
    if old_str in line:
        new_line = line.replace(old_str, new_str)
    else:
        new_line = line
    file_new.write(new_line)
file.close()
file_new.close()

  方法2:若想覆盖原先的文件

  上面的代码是生成了一个新的文件,如果想要覆盖,需要使用第三方模块

  

import os 

# 以下代码可上面一样
f = 'blue'
f_new = '{}.new'.format(f)
old_str = 'how'
new_str = 'how222.how'
file = open(f, 'r', encoding='utf-8')
file_new = open(f_new, 'w', encoding='utf-8')
for line in file:
    if old_str in line:
        new_line = line.replace(old_str, new_str)
    else:
        new_line = line
    file_new.write(new_line)
file.close()
file_new.close()
os.rename(file_new, file)
# 新文件名字改成原先的名字
# Windows 的方法有点不一样 os.replace
# 帮助文档说明replace会覆盖原文件

 

posted @ 2018-08-23 09:38  竹子128  阅读(142)  评论(0编辑  收藏  举报