(1)python文件操作

【1】文件的读写追加(rwa)

【1.0】基本形式

f = open("d:\\python\\temp\\1.txt",encoding="utf-8")   # 读:文件句柄,也可以 
f3 = open("1.txt",'r',encoding="utf-8")
f1 = open("1.txt",'w',encoding="utf-8")  # 写:文件句柄,是创建一个文件,会覆盖现有文件
f2 = open("1.txt",'a',encoding="utf-8")  # 追加:文件句柄
f3.close()   # 文件关闭
f.read()  # 读取文件内容
f.write('111') # 写入内容到文件
f3.closed()    # 判断文件是否关闭
print(f3.read(5))  # 读取且移动5个字符,结果:我有一个梦想 =》我有一个梦
print(f3.tell())  # 查看文件句柄指针指向的字符位置,因为用的是utf字符集,所以一个中文占3个字节,结果:15
print(f3.readline().strip())   # 它会读当前行指针到改行行末的数据,结果:我有一个梦想=》想,因为上面的read已经移动指针到这里
print(f3.tell())       # 结果:20,为什么是20?改行我有一个梦想是6个字符,utf就是18,加上readline 换行其实\n也是2个字符
f3.seek(0)   # 文件句柄指针指向文件开头
print(f3.seekable())  # 判断文件句柄指向是否可以移动,返回bool值
print(f3.read(5))  # 结果:我有一个梦想=》我有一个梦
print(f3.seek(3))  # 当前指针位置移动到第3个字节的位置,因为是utf8所以一个中文占3个字节,这里其实就是移动到了第2个字符的位置
print(f3.readline().strip())   # 结果:有一个梦想
print(f3.flush)     # 把内存buffer中的数据刷新同步到磁盘,一般情况下是等文件buffer(可能) 满了才批量刷到磁盘

【1.1】读:f = open("1.txt",'r',encoding="utf-8")

f = open("d:\\python\\temp\\1.txt",encoding="utf-8")   # 读:文件句柄,也可以 f3 = open("1.txt",'r',encoding="utf-8")
data = f.read()
print(f.readable())   # 判断文件句柄指向是否可读,返回bool值  ,# 也可以 data = open("d:\\python\\temp\\1.txt",encoding="utf-8").read()
data1 = f.read()
print(data,data1)     # 为什么data1输出时空的?因为文件里有一个阅读指针,在data的时候已经进行过 f.read(),阅读到文件末尾了,再read()就从获取不到内容了
f.close()             # 关闭文件

【1.2】写:f = open("1.txt",'w',encoding="utf-8")

会创建一个空文件

f1 = open("1.txt",'w',encoding="utf-8")  # 写:文件句柄,是创建一个空文件,会覆盖现有文件
f1.write("今天天气好晴朗")     # 在文件末尾写入
print(f1.writable())         # 判断文件句柄指向是否可写,返回bool值
f1.write("处处好风光~好风光")  # 如果这样写,默认会放到同一行,除非在上一行加上换行符\n
f1.close()

【1.3】追加:f = open("1.txt",'a',encoding="utf-8") 

文件存在即追加,文件不存在则新建

f2 = open("1.txt",'a',encoding="utf-8")  # 追加:文件句柄
f2.write("你渴望知识吗?")
f2.close()

【2】高级查询:文件句柄指针

【2.1】基本遍历

# print(f3.readline())   # 阅读指针当前行,并把文件指针指向下一行
# print(f3.readlines())       # f3.readlines() 把文件内容封装成列表,每行算一个元素,且元素值末尾带有\n
for line in f3.readlines():   # 遍历文件中的每一行
    print(line.strip())

for index,line in enumerate(f3.readlines()):   # 只查看第3行
    if index == 2:  # 因为从0开始,第3行下标就是2
        print(line.strip())
for line in f3:  # 迭代器
    print(line)

【2.2】文件句柄指针位置操作

print(f3.read(5))  # 读取且移动5个字符,结果:我有一个梦想 =》我有一个梦
print(f3.tell())  # 查看文件句柄指针指向的字符位置,因为用的是utf字符集,所以一个中文占3个字节,结果:15
print(f3.readline().strip())   # 它会读当前行指针到改行行末的数据,结果:我有一个梦想=》想,因为上面的read已经移动指针到这里
print(f3.tell())       # 结果:20,为什么是20?改行我有一个梦想是6个字符,utf就是18,加上readline 换行其实\n也是2个字符
f3.seek(0)   # 文件句柄指针指向文件开头
print(f3.seekable())  # 判断文件句柄指向是否可以移动,返回bool值
print(f3.read(5))  # 结果:我有一个梦想=》我有一个梦
print(f3.seek(3))  # 当前指针位置移动到第3个字节的位置,因为是utf8所以一个中文占3个字节,这里其实就是移动到了第2个字符的位置
print(f3.readline().strip())   # 结果:有一个梦想
print(f3.flush)     # 把内存buffer中的数据刷新同步到磁盘,一般情况下是等文件buffer(可能) 满了才批量刷到磁盘

【3】同时多个操作(比如同时读写)

【3.1】读写:一般形式(r+,w+,a+)

f = open('1.txt', 'r+',encoding="utf-8")    # 读+写(3.0+只能在文件末尾追加)
f = open('1.txt', 'w+',encoding="utf-8")    # 写+读,也会有w的特性,会新建文件,如果文件存在则用空白文件覆盖(3.0+只能在文件末尾写入追加)
f = open('1.txt', 'a+',encoding="utf-8")    # 追加+读

【3.2】二进制读写(rb+,wb+,ab+)

f = open('1.txt', 'ab+')
f.write('~~~~~~~11111111111~~~~~~~~~'.encode('utf8'))
f.write('~~~~~~~222222222222222~~~~~~~~~'.encode('utf8'))
data=f.read()
print(data)
f.close()

同理 web+  wb   rb 等就不用说了吧?

【4】修改文件内容

【4.1】指定字符串替换

"""
如何修改文件?
(1)从原文件逐行读
(2)定位是否有到自己修改的位置
    如果不是则把该行写入到新文件
    如果定位到了,则修改后,把改行写入到新文件
原文:
    我有一个梦想
    就是飞向海洋
    无边无际的海
    是我心中的向往
修改:
无边无际的海=》大海啊大海
"""

f = open("梦想.txt",'r',encoding='utf-8')
f_new = open("new_梦想.txt",'w',encoding="utf-8")
for line in f:
    if "无边无际的海" in line:
        line = line.replace("无边无际的海","大海啊大海")
    f_new.write(line)

   

 

【4.2】文件操作实现sed

# Auth chaoqun.guo
"""
如何修改文件?
(1)从原文件逐行读
(2)定位是否有到自己修改的位置
    如果不是则把该行写入到新文件
    如果定位到了,则修改后,把改行写入到新文件
原文:
    我有一个梦想
    就是飞向海洋
    无边无际的海
    是我心中的向往
修改:
无边无际的海=》大海啊大海
"""
import sys

f = open("梦想.txt",'r',encoding='utf-8')
f_new = open("new_梦想.txt",'w',encoding="utf-8")

find_str = sys.argv[1]
replace_str = sys.argv[2]
print(find_str,replace_str)

for line in f:
    if find_str in line:
        line = line.replace(find_str,replace_str)
    f_new.write(line)
f.close()
f_new.close()

sys.argv是什么?参考:https://www.cnblogs.com/aland-1415/p/6613449.html

  

      

   

 

 完成!

【5】使用 with 关键字避免文件忘记 close   

# Auth chaoqun.guo
# (1)with 语句:为了避免打开文件后忘记关闭
with open('梦想.txt','r',encoding="utf-8") as f:    # 代替了 f = open("梦想.txt",'r',encoding='utf-8')
    for line in f:
        print(line.strip())

print("-------------------------".center(50,'-'))
# (2)with 写多个语句
with open('梦想.txt','r',encoding="utf-8") as f,\
    open('new_梦想.txt','r',encoding='utf-8') as new_f:
    for line in f:
        print(line.strip())
    for line in new_f:
        print(line.strip())

 

【案例】进度条

import sys
import time

for i in range(50):
    sys.stdout.write('#')
    sys.stdout.flush()
    time.sleep(0.1)

 

posted @ 2020-11-06 18:31  郭大侠1  阅读(254)  评论(0编辑  收藏  举报