文件主要分为两种,文本文件和二进制文件(图片、视频)
需要读取非ascii编码的文件,必须以二进制模式打开,再解码
1 | '/Users/michael/gbk.txt', 'rb') f = open( |
换种思路,利用自带模块codecs
自动转码
1 | import codecs |
¶1. 读取文件
1 | f.read(size) |
-
read()
读取数据并转换为string(text mode)或者bytes(binary mode)
size为数值,可为正负,默认读取文件所有内容
到达文件底,返回空字符串 -
readline()
从文件中读取一行。 -
readlines() 和read()相似读取所有行,但是会将文件按照行分隔符
\n
解析为列表。 -
这三种方法都会将换行符读入,需要手动去掉
1 | with open('filepath','r') as f: |
¶1.1 传统读取方式
用了open打开新的文件对象需要及时关闭
1 | file = open("infile") |
- readlines 速度最快
- readline 比 fileinput要快一些
¶1.2 比较两个文件相同的ip
1 | import bisect |
¶1.3 读取特定文件再排序输出
1 | result = list() |
¶2. 写文件
1 | f1 = open('test.txt', 'w'): |
-
writelines()对应readlines(), 针对列表操作,每一个接受的字符串需要加上换行符
-
要写入特定编码的文本文件,请效仿codecs的示例,写入unicode,由codecs自动转换成指定编码。
¶3. file_obj(offset, whence=0)
- offset 偏移量
- whence, 位置,0为文件开头,1当前位置,2为文件尾部
- whence只适用于
'r'
,对于写或者追加模式不起作用。
¶4. 字符串编码
1 | ## 传入encoding参数,读取以某种方式编码的文件,errors进行忽视 |
¶5. 交换文件行位置
1 | with open('test.txt', 'r') as input, open('output.txt', 'w') as output: |
¶6. 文件序列化
序列化的过程指的是将变量从内存变成可存储或传输的过程,在python种叫做pickling,而其他语言叫做serialization, marshalling, flattening.
pickle主要应用于对json文件的操作
1 | ## py2 有Pickle和高效的cPickle,py3只有pickle |
- dumps 将任何对象序列化为bytes
- dump 将对象序列化为file-like object
- load 将 file-like object反序列化为对象
- loads 将bytes反序列化为对象
¶7. 排序
读取文件并按照某列排序
1 | import csv, sys, operator |
¶8. StringIO 和 BytesIO
从内存中读写
1 | from io import StringIO |
如果对文件写入需要check seek的位置,可以通过f.readline()将seek的位置定位到最后,也可以用f.seek(n)
¶9. python读写json文件
1 | #输出 |
- load 从file-like object读取字符串并反序列化
- loads 把json的字符串反序列化
- dump 把json写入file-like object
- dumps 返回一个str
¶10. python读写csv文件
1 | import csv |
1 | #write |
¶10.1 从hdfs中读取csv
1 | #read csv from HDFS |
参考: