欢迎光临
生活尽了力,其他靠佛系

【Python】文件读写

文件访问是一门语言中非常重要的一环,涉及的方面也非常广泛。例如在数据挖掘中,数据量很大,整个挖掘程序也可以分为几个部分,我们也就需要把几个部分运行的结果保存下来,这样下次处理再在此基础上进行。当然在进行文件处理时,针对的文件也比较多例如常见的excel,csv,txt,pickle等。现根据实际中运用的做以下总结,后期再做补充。很多非常基本的内容可参考文献1,本总结不再赘述。

1 基本操作

1.1 改变工作目录

在进行文件读写时,我们必然要做的是确定程序运行路径以及要读取文件的路径。如果使用脚本去运行,工作目录就在脚本所在目录,一般情况下,我们需要处理的文件会在一个固定的目录下,那么就需要改变工作目录,为了能够实现这个功能,我们需要引入Python的一个包os,查看当前工作目录的方法时os.getcmd(),改变工作目录的方法是os.chdir(string)。如:

import os
print(os.getcmd())       # 查看程序运行环境路径
# 改变当前程序运行环境到 D盘的data文件下
os.chidr("D:/data")      # 需要注意的是路径使用斜杠 / 不是反斜杠 \

1.2 txt文件读取

Python进行文件读写的函数是open()函数,其中格式file_handler = open(filename, mode='r',encoding='utf8'),其中open函数中涉及的参数:

  • filename 需要打开/保存文件的路径
  • mode 打开方式,当该参数放在filename后,mode可以省略。读写模式如下表。
  • encoding 文件读/写的编码格式

默认情况下是以读方式进行,即r。在读取文件成功时,就会返回一个读取文件的句柄,后面的操作就需要这个句柄进行。

模式 说明
r 以读方式打开文件,仅读取文件信息
w 以写方式打开文件,仅向文件中写入信息,如果文件存在,则清空该文件,再进行写入,如果对应路径的文件不存在,则创建一个文件
a 以追加的方式打开文件,文件指针自动移动到文件末尾,仅可从文件末尾开始写入,如果文件不存在时,则创建一个文件
r+ 以读写的方式打开文件,可对文件进行读写操作
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
b 以二进制模式打开文件

上面只罗列了部分经常使用的文件打开模式,更多内容可参考官方文档,或者文献1,那么打开文件后又该如何操作呢,上面介绍打开文件的方式,在文件操作完毕后,我们需要手动关闭文件,在实际编程中使用with open(filename ...) as f:进行操作最多,也不需要手动关闭文件,假设我们打开一个文件,然后命名为f,针对f的操作如下表:

方法 说明
f.close() 关闭文件
f.flush() 刷新输出缓存
f.read([count]) 读出文件,如果有count,则读出文件count个子节
f.readline() 读出一行信息
f.readlines() 读出所有行,返回到一个list中
f.seek(offset[,where]) 把文件指针移到相对于where的offset位置,where为0表示文件开始处,也是默认值,1表示当前位置,2表示文件结尾
f.tell() 获取文件指针位置
f.write(string) 将string字符串写入文件
f.writelines(list) 把list中的字符串一行一行地写入文件,注:连续写入,没有换行

我们常用的文件读入函数是read()、readline()、readlines(),假设在当前Python程序目录下有一个data.txt文件,其中数据如下:

a,b,c
1,2,3

几种读取方式:

print("****style 1*****")
with open("data.txt", 'r') as f:
    res = f.read()
print(res)
print("****style 2*****")
with open("data.txt", 'r') as f:
    res = f.readlines()
print(res)
print("****style 3*****")
with open("data.txt", 'r') as f:
    res = f.readline()
    print(res)
    res = f.readline()
    print(res)

结果

****style 1*****
a,b,c
1,2,3
****style 2*****
['a,b,c\n', '1,2,3']
****style 3*****
a,b,c

1,2,3

1.3 CSV文件读取

我们经常习惯使用Excel表存储数据,但Excel表数据直接用Python读取时行不通需要引用其它包。一个常用的方法是将Excel文件另存为csv格式数据,而csv格式数据是逗号分隔的数据表,每两个数据之间用逗号隔开,实际和txt相似。如果进行更深入地处理,我们可以借助于pandas包对csv数据、excel数据进行处理,这里个先不展开。

1.4 使用JSON处理数据

前面已经介绍过,在读取文件时使用read()方法就可以把整个文件的内容读出来,然后使用,但是当想保存列表和字典这样复杂的数据结构时,单靠read()函数去解析返回存在很多问题。在Python中允许用户使用常用的数据交换格式JSON(JavaScript Object Noation),在标准模块json可以接受Python的数据结构,并将它转换为字符串表示,这个过程也叫序列化(Serialize),而从字符串表示形式重新构建成指定的数据结构的过程称为反序列化(Deserialize)。在序列化和反序列化的过程中,表示该对象的内容可以放在文件中。
现在我们来试一试,假设我们有一个字典(可以看成时Json格式的数据)x=dict(height=175,age=25),我们可以使用y = json.dumps(x)将x转换为字符y。反过来可以使用json.loads(y)将字符串转为原来的字典。如果想保存到文JSON文件中,可以使用上面函数的变体dump()、load()。具体实例如下:

import json
x=dict(height=175,age=25)
print("原字典内容", x, "类型为", type(x))
y = json.dumps(x)
print("序列化后的字典",y, "类型为", type(y))
x = json.loads(y)
print("反序列化后又还原为原始的字典", x,  "类型为", type(x))

# 使用dump()、load()对文件进行处理
# 写入到文件
with open("test.json", "w") as f:
    json.dump(x, f)

# 读取到对象中
with open("test.json", "r") as f:
    x = json.load(f)

print(x)

结果如下:

原字典内容 {'height': 175, 'age': 25} 类型为 <class 'dict'>
序列化后的字典 {"height": 175, "age": 25} 类型为 <class 'str'>
反序列化后又还原为原始的字典 {'height': 175, 'age': 25} 类型为 <class 'dict'>
{'height': 175, 'age': 25}

除此之外还有其它类型的数据读取,如pickle,可参考文件2.

Reference

1.https://www.runoob.com/python3/python3-file-methods.html
2.https://blog.csdn.net/meiqi0538/article/details/80964312

赞(0) 打赏
未经允许不得转载:AIAS编程有道 | Artificial Intelligence Algorithm Scientist » 【Python】文件读写
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用,就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏