001.00 一般檔案處理
001.00 一般档案处理#
建檔日期: 2019/07/28#
更新日期: 2020/03/28 错误更正,增加路径名的脱离字符的说明#
Win 10 | Python 3.7.4 |
档案目录:#
- Script (.py) 文件位置: D:/Python_Work/001.00 文本文件处理#
- 文字 / 二进制文件位置: D:/Python_Work/001.00 文本文件处理 / 文本文件#
- 图形文件: D:/Python_Work/001.00 文本文件处理 / 图形文件 /
#
<<<注意>>> 本文为作者学习笔记,如有错误,敬请见谅,繁请提示修正,谢谢!#
# 檔名: 001.00 一般档案处理.py
# 预备: 档案001.txt以unicode存盘, 档案002.txt以ANSI存档
# 档案内容, 印在console上.
# 文件名变数
filename1 = 'D:/Python_Work/001.00 一般档案处理/一般档案/一般档案001(unicode).txt'
filename2 = 'D:/Python_Work/001.00 一般档案处理/一般档案/一般档案002(ansi).txt'
# 定义档案打印函数
def print_all(filename, codec):
fn = open(filename, encoding=codec)
data = fn.read()
print(data)
fn.close()
print_all(filename1, "utf_16")
print("")
print_all(filename2, "mbcs")
1. 数据文件名称字符串#
- 相对路径:
"一般档案/一般档案001.txt"
- 絶对路径:
“D:/Python_Work/001.00 一般档案处理/一般档案/一般档案001.txt”
分隔符可以使用 /
或 \\
, 但在 Python 中,\
为脱离符,所以使用 \
, 必须为 \\
. 几种表示方式,如
- 'd:\\test.txt'
- 'd:/test.txt'
- r'd:\test.txt', r 代表 raw,
\
不會被當作脱离符
2. 打开档案#
fileobj
=open
(filename, access_mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)filename
: 文件名字符串access_mode
: 访问模式,默认为只读’r’, 不冲突的模式可以组合一起- r - 只读模式 (Read Mode)
- w - 写入新文件 (Write Mode)
- x - 独占档案,不存在则出错
- a - 附加新数据
- b - 二进制文件 (Binary Mode)
- t - 文本文件 (Text Mode)
- + - 可读可写
- 常用的参数只有”r”, “w”, “t” 及”b”, 也就是二进制文件 / 文本文件,读 / 写,四者混用.
buffering
: 0 - 没缓冲 (只有 b 模式可用), 1 - 行缓冲 (只有 t 模式可用), >1 - 缓冲区大小,<0 - 系统默认,b 模式下为 io.DEFAULT_BUFFER_SIZE, 典型值为 4096 或 8192 bytes; t 模式下,交谈式文本文件,isatty () 是 True, 则为行缓冲,否则如 b 模式一样encoding
: 仅供文本文件使用,总共至少有 113 种编码,比如’ascii’, ‘big5’, ‘big5hkscs’, ‘gbk’, ‘gb18030’, ‘hz’, ‘utf_8’, ‘utf_16’等等。一定要确定文件格式,否则会读不进数据,比如记事本中可以存成四种不同格式的 txt 檔,ansi (mbcs), Unicode (utf_16), Unicode Big endian (utf_16_be) 以及 UTF-8 (utf_8).errors
: coding/encding 错误时的处理程序'strict'
: 编码错误,则引发 ValueError 异常。默认值 None 具有相同的效果。'ignore'
: 忽略编码错误可能会导致数据丢失。'replace'
: 导致在有错误数据的地方插入替换标记。<<<待确认>>>'surrogateescape'
: 任何不正确的字节,将被转回到相同的字节中。这对于处理未知编码的文件很有用。'xmlcharrefreplace'
: 写入时才有用,编码不支持的字符将替换为&#nnn;。'backslashreplace'
: 用 Python 的反向转义序列替换格式错误的数据。'namereplace'
: 写入时才有用,用 \ N {…} 转义序列替换不支持的字符。
newline
:- 读入模式时: None: ‘\n’, ‘\r’, or ‘\r\n’会被转换成’\n’; 空字符串:不处理;‘其他’: 则只取回不含’其他’的字符串.
- 写出模式时: None: ‘\n’会被转换为 os.linesep; “”/‘\n’不处理;‘其他’: 则直接替换.
closefd
: 如果 closefd 为 False 并且给出了文件描述符而不是文件名,则在关闭文件时,底层文件描述符将保持打开状态。如果给出文件名,则 closefd 必须为 True(默认值),否则将引发错误。<<<待确认>>>opener
: 通过传递可调用的开启者可以使用自定义开启器。 然后通过使用(file,flags)调用 opener 来获取文件对象的基础文件描述符。 opener 必须返回一个打开的文件描述符(传递 os.open 作为 opener 导致类似于传递 None 的功能)。<<<待确认>>>
3. 关闭档案 fileobj.method ()#
close()
刷新缓冲区数据后,关闭档案
4. 文件属性 fileobj.method ()#
closed()
档案已关闭?True / Falsemode()
档案访问模式 access modename()
文件名softspace()
输出后没加一个空格?True / False
5. 档案读取 fileobj.method ()#
read([size])
读入字节数,省略则全部读入,档案太大就不太合适.readline()
一行一行读,占内存少,不过比较慢。每一行字符串最后会带有’\n’, 最后一行可能没有’\n’, 可以使用 line.strip (‘\n’) 处理. print (‘\n’) 会产生两空行,可以使用 print (“”)readlines()
读出字符串,组成一个 list, 占内存多,不过比较快.linecache.method()
仅适用于 ASCII 或 utf-8 的档案,耗内存;getline(filename, lineno[, module_globals=None])
读入第几行.getlines(filename)
全部读入 list 中.clearcache()
清除缓存checkcache(filename=None)
检查 (所有) 档案的缓存lazycache(filename[, module_globals=None])
捕捉足够信息供使用updatecache(filename)
更新缓存,同时更新 getlines 的 list 内容
# 檔名: 001.01 一般档案处理.py
# readline(), readlines(),linecache.getline(),linecache.getlines() 用法
import linecache
# 文件名变数
filename1 = 'D://Python_Work//001.00 一般档案处理// 一般档案// 一般档案001(unicode).txt'
filename2 = 'D://Python_Work//001.00 一般档案处理// 一般档案// 一般档案002(ansi).txt'
filename3 = 'D://Python_Work//001.00 一般档案处理// 一般档案// 一般档案003(utf-8).txt'
# readline()用法 -- string
fn=open(filename1,encoding='utf_16')
line = fn.readline()
while line:
print(line.strip('\n'))
line = fn.readline()
fn.close()
print('')
# readlines()用法 -- list
fn=open(filename2,encoding='mbcs')
lines = fn.readlines()
for line in lines:
print(line.strip('\n'))
fn.close()
print("")
# linecache.getlines() 用法 -- 不用open, 直接读全部, 仅适用于ASCII或utf-8
lines = linecache.getlines(filename3)
for line in lines:
print(line.strip('\n'))
linecache.clearcache()
print("")
# linecache.getline() 用法 -- 不用open, 直接读某一行, 仅适用于ASCII或utf-8
# 文本文件有9行
for lineno in range(1,10):
line = linecache.getline(filename3,lineno)
print(line.strip('\n'))
6. 写入档案 fileobj.method ()#
write(string)
写入字符串,不会自动加’\n’writelines(list)
写入整个字符串 list, 不会自动加’\n’seek(offset[, whence])
跳过 offset 个,正值向前,负值向后,whence 0 表示从头开始,1 表示目前位置,2 表示最后位置。有特别格式的档案,不能跳 offset, 不然译码器无法解析档案的编码格式作读取,将造成错误,最好是二进制文件.flush()
更新缓冲区,一般文件关闭后会自动更新.tell()
指出目前档案内容指针位置.fileno()
返回整数值的档案描述符,类似 open () 返回值,供 OS 档案操作使用.isatty()
是否为 TTY 设备?True or False, TTY: 使用者输入输出设备,非档案.next()
返回下一行。档案刚打开时,则为第一行.truncate([size])
把档案 size 后的内容删除,没 size, 则从目前位置起删除。只读模式不能用.
# 檔名: 001.02 一般档案处理.py
# writeline() & writelines() 用法
# 文件名变数
filename1 = 'D:/Python_Work/001.00 一般档案处理/ 一般档案/ 一般档案001(unicode).txt'
filename2 = 'D:/Python_Work/001.00 一般档案处理/ 一般档案/ 一般档案001(unicode)_rev1.txt'
filename3 = 'D:/Python_Work/001.00 一般档案处理/ 一般档案/ 一般档案001(unicode)_rev2.txt'
with open(filename1, 'r', encoding='utf_16') as fileobj_read:
# Note: readlines doesn't trim the line endings
lines = fileobj_read.readlines()
with open(filename2, 'w') as fileobj_write1:
fileobj_write1.writelines(lines)
with open(filename3, 'w') as fileobj_write2:
for line in lines:
fileobj_write2.write(line)
fileobj_read.close()
fileobj_write1.close()
fileobj_write2.close()
# 檔名: 001.03 一般档案处理.py
# write() 用法
filename1 = "图形文件/图形文件001.jpg"
filename2 = "图形文件/图形文件001_bak.jpg"
fileobj_read = open(filename1,"rb")
file = fileobj_read.read()
fileobj_write = open(filename2, "wb")
fileobj_write.write(file)
~ The End ~#
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: