Python语言之Python文件操作
小标 2018-08-09 来源 : 阅读 1211 评论 0

摘要:本文主要向大家介绍了Python语言之Python文件操作,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言之Python文件操作,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

阅读目录1.文件操作的流程2.打开文件的常用模式2.1.一般模式2.2.混合读写模式2.3.二进制模式,"b"表示处理二进制文件2.4.兼容读写模式3.文件的其他操作方法:3.1.刷新缓存 3.2.移动光标3.3.截取文件内容3.4.其他一些简单的方法:4.with语句,自动关闭文件5.修改文件内容的一般方法: 本文主要记录Python中的文件的常用操作
回到顶部1.文件操作的流程
1)打开文件,得到文件句柄并赋值给一个变量2)通过句柄对文件进行操作3)操作完成,关闭文件
回到顶部2.打开文件的常用模式
有以下2个示例文件:
# hello_gbk.txt文件为GBK编码,hello_utf8.txt文件为utf-8编码


Somehow, it seems the love I knew was always the most destructive kind
不知为何,我经历的爱情总是最具毁灭性的的那种
Yesterday when I was young
昨日当我年少轻狂
The taste of life was sweet
生命的滋味是甜的
As rain upon my tongue
就如舌尖上的雨露
I teased at life as if it were a foolish game
我戏弄生命 视其为愚蠢的游戏

View Code
2.1.一般模式
"r"模式
#"r"只读模式,是默认模式,默认编码是gbk,不可写

# print(f.read(10))        # 默认读全文,可以按照指定字符数量读文件内容
# print(f.readline(10))     # 默认读取一行,遇到\r或者\n为止,适合读小文件,也可以按照指定字符数量读文件内容
# print(f.readlines(1))       # 默认读取全文转换为带\n的列表,括号中指定数字,读取第一行
# print(f.readlines()[3])     # 可以用这种方式读取出某4行

实例1:文件读取

f = open(file='hello_gbk.txt',mode='r',encoding='gbk')    # 标准完整格式,文件名可以加绝对路径
# f = open('hello_gbk.txt')                   # 最简单的写法
# f = open('hello_gbk.txt',encoding='gbk')           # 简写2,最后的encoding必须写上
print(f.readline())                      # 读一行内容
print('分隔线'.center(50,'-'))
data = f.read()                                   # 读取剩下的所有内容,文件大时不要用
print(data)                                     #打印文件
f.close()                                      #关闭文件

注解:mode='r' encoding='utf-8' #表示 只读 硬盘上的0101按照utf-8的规则去‘断句’,再将断句后的每一段0101转换成Unicode的01010,Unicode对照表中0101和字符的对应关系。mode='rb' # 以什么形式存的就以什么形式读 ,二进制打开,给机器看的,用于视频,图片,网络传输
实例2:读前3行内容--->思路:使用循环# 简单想法:尝试以下3种方式

# 方法1:
f = open(file='hello_gbk.txt',mode='r',encoding='gbk')
for i in range(3):
    print(f.readline().strip())

# 方法2:
f = open(file='hello_gbk.txt',mode='r',encoding='gbk')
for index,line in enumerate(f.readlines()):
    if index == 5:
        print("--------")
        exit()
    print(line.strip())
# 注意:以上2中方法在读大文件的时候可能会把内存撑爆,所以readline()的方式不能用于读大文件

# 方法3:优化后,读一行删一行,内存中只保留一行内容,如下:
f = open(file='hello_gbk.txt',mode='r',encoding='gbk')
count = 0
for line in f:                            # 不是列表了,变成了文件迭代器
    if count == 5:
        print("----------")
        count += 1
        exit()
    print(line.strip())
    count += 1
# 这种方法3是读取文件的最优方法

"w"模式 
# "w"创建文件,不可读文件,如果有同名文件则相当于清空数据,重新写入,所以要慎用
实例1:创建文件

f = open("hello2.txt",'w')                      # 不指定编码,默认创建gbk格式的文件
f.write("hello2")
f.close()

f = open("hello2.txt",'w',encoding='utf-8')         # 如果要创建指定编码格式的文件,需要加“encoding=”字段
f.write("hello2") 
f.close()

注意:在pycharm中写的内容用的是unicode,但在保存成txt文件时会自动转码为GBK的
"a"模式 
# "a"追加,但不可读文件,使用a可以直接打开文件,然后直接追加内容
实例1:追加内容

f = open("hello2.txt",'a',encoding='gbk')
f.write("\n我是追加的内容1")                   # 写入的内容需要和原文件编码相同,否则会出现部分乱码,\n用于换行
f.close()

2.2.混合读写模式
"r+"模式  
# "r+"读写模式。可读,可写,可追加。偶尔用
实例1:追加写入文件内容

f = open("hello2.txt",'r+',encoding='gbk')         # 使用"r+",不管怎样移动光标,文字都会追加到文件最后
data = f.read()                                 # 必须先读到内存中,然后追加,最后写回文件中
print(data)
f.write("\n再写点东西")
f.close()

"w+"模式
# "w+",写读模式,会先创建一个文件再写入,也就是清空文件内容,慎用(不用)
实例1:

f = open("hello2.txt",'w+',encoding='gbk')
data = f.read()
print(data)                                       # 先创建空文件,所以读不出内容,也就无打印
f.write("\n我还要写点东西")
f.close()

"a+"模式 
# "a+",同a,追加模式,可读(可用)
2.3.二进制模式,"b"表示处理二进制文件
二进制"rb"模式
#1)网络传输:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注#2)音视频文件读写
实例1:

f = open("hello3.txt",'rb')                   # 使用二进制写模式rb打开文件,不需要使用encoding='gbk'
print(f.read())                               # 打印的是二进制额bytes数据
f.close()

# 实例2:调用chardet模块(需要单独安装),推断文件的编码格式

pip3 install chardet 


import chardet
result = chardet.detect(open(file='hello3.txt',mode='rb').read())
print(result)
--->{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

二进制"wb"模式 
# 用二进制创建文件,音视频,图片或者其他任何数据等,可以直接传输,可以手动编码实例1:

f = open("hello3.txt",'wb')                      # 使用二进制写模式wb打开文件,不需要使用encoding='gbk'
f.write("hello3中国你好,二进制写一句".encode('gbk'))    # 使用二进制写入“hello3”,需要转码,否则报错,可以指定GBK,utf-8等进行编码
f.close()   

二进制"ab"模式
# 二进制方式追加文件内容实例1:

f = open("hello3.txt",'ab')                        # 使用二进制追加模式ab打开,进行追加,不需要使用encoding='gbk'
f.write("\n我是用二进制追加的内容".encode('gbk'))      # 如果使用二进制方式ab写文件,需要转码,否则报错
f.close()

2.4.兼容读写模式
# 用于windows和linux的兼容"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

rU
r+U

回到顶部3.文件的其他操作方法:
3.1.刷新缓存 
# f.flush()将内存中的内容手动刷新到硬盘中,需要到windows的客户端里测试刷新效果--------------------------------

f = open("hello3.txt", 'w')
f.write("\ntest flush")
f.flush()
f.close()

# 拓展:进度条

import sys,time
for i in range(50):
    sys.stdout.write("#")     # 默认不换行
    sys.stdout.flush()
    time.sleep(0.5)

3.2.移动光标
# f.tell()返回当前操作的文件的光标位置# f.seek()移动光标到指定位置# f.read()是按照字符读文件,f.tell()和.seek()是按照字节读文件

# 拓展:不同的字符编码中,每个字符所占用的字节长度不一样,所以在不同的编码中同一个字的seek就不同
1)ASCII码一个字符默认占1个字节,8位,不能存中文,所以出了Unicode
2)GBK中:一个中文字符占用2个字节,1个英文字符占用1个字节
3)utf-8是一个汉字占用3个字节,所有的英文用ASCII码存,一个字符默认占1个字节,8位
4)unicode中:一个中文字符占2个字节,16位,

# 实例:不同字符编码下的光标位置
使用GBK

f = open("hello_gbk.txt","r",encoding="gbk")
f.seek(13)                             # 光标移动13个字节,在GBK下中文占2个字节,英文占1个字节
print(f.read(10))                      # 读10个字符,不区分中英文
print(f.tell())                        # 回车\n也计算了一个字节
f.close()

使用utf-8

f = open("hello_utf8.txt","r",encoding="utf8")
f.seek(13)                              # 光标移动13个字节,在utf-8下中文占3个字节,英文占1个字节,注意文件开头占3个字节
print(f.read(10))                       # 可以看到与上面的结果不相同
print(f.tell())
f.close()

3.3.截取文件内容
# .truncate()从第n个字符截断(去掉)文件内容1)指定长度:截取文件开头到指定长度位置的字符内容2)不指定长度:截取文件开头到光标所在位置的字符内容
# 实例1:截取开头10个字符的内容

# 方法1:截取开头到指定长度的字符,简单高效
f = open("hello3.txt", 'r+', encoding='gbk')      # 使用"r+"或"a"
f.seek(100)                                       # 与光标在哪无关
print(f.tell())
f.truncate(10)
f.close()

# 方法2:移动光标,从开头截取到光标位置
f = open("hello3.txt",'r+',encoding='gbk')        # 使用"r+"或"a"
f.seek(10)
print(f.tell())
f.truncate()
f.close()

3.4.其他一些简单的方法:

f.fileno()      用于返回文件句柄在内核中的索引值,在做IO多路复用时可以用到,一般用不到
f.isatty()      判断是否是个终端文件
f.seekable()     判断文件是否可进行seek操作 
f.readable()     判断文件是否可读,w不可读
f.writable()     判断文件是否可写


f = open("hello_gbk.txt",'r+',encoding='utf-8')    # 使用"r+"
print(f)
print(f.encoding)                       # 打印文件的编码格式,注意后面不加括号
print(f.name)                           # 打印文件的名字
print(f.buffer)
print(f.errors)

回到顶部4.with语句,自动关闭文件
# 为了避免打开文件后忘记关闭,可以通过with方法打开文件

with open("hello2.txt",'r',encoding='gbk') as f:
    print(f.read())

# 如果一次打开较多文件,建议换行书写代码

with open("hello2.txt") as f1 ,\
     open("hello3.txt") as f2:
    for i1 in f1:
        print(i1.strip())
    for i2 in f2:
        print(i2.strip())

回到顶部5.修改文件内容的一般方法:
1)类似vim这种,将修改的文件内容加载到内存中,修改完保存到源文件中内存中的内容不存在写数据就覆盖的问题会自动移位但是如果打开大文件,内存可能不够,或者系统变慢2)读到缓存文件中逐行读写,修改完使用临时文件覆盖原文件

import os
f_name = "hello3.txt"
f_new_name = "%s.new" %(f_name)
old_str = "[[改了又改]]"                        # find_str = sys.argv[1]
new_str = "[想改就改,改的响亮]"                 # replace_str = sys.argv[2]
f = open(f_name,'r',encoding="gbk")
f_new = open(f_new_name,'w',encoding="gbk")
for line in f:
    if old_str in line:
        new_line = line.replace(old_str,new_str)   # new_line = line.replace(find_str,replace_str)
    else:
        new_line = line
    f_new.write(new_line)
f.close()
f_new.close()
os.replace(f_new_name,f_name)
# os.rename(f_new_name,f_name)                 # mac,linux
本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程