python文件处理
打开一个文件,打开的方式就是文件处理。
应用程序不可以直接操作硬件。需要通过os(操作系统)来操作硬件。
python打开文件的格式:
三要素:
open('文件的绝对路径','你要读写还是追加','选择字符编码的类型')
open ('C:UsersASUSDesktop用户.txt','r',encoding='utf-8')
把绝对路径粘贴过来的时候,他的颜色会不对,因为f之类的是转译符。这样打开文件就会。有问题。
对于windows来说,windows10的字符编码是gbk。所以,用什么字符编码写的,就要用什么字符编码来读。
f = open('C:UsersA USSDesktop用户.txt','r',encoding='utf-8')#f就相当于你操作的这一串东西的句柄。以后要想改变你操作的这一串东西,直接对f操作即可。
data = f.read()
print(data)
f.close() #读完一定要关闭,close做的第一件事是告诉操作系统,我已经读完了这个文件,你帮我去关闭掉,第二件事是回收f这个变量。
如果直接运行会报错,报语法错误,此时有三种解决方案:
第一种:对’’再进行转译
open ('C:\Users\ASUS\Desktop\用户.txt','r',encoding='utf-8')
第二种:
open ('C:/Users/ASUS/Desktop/用户.txt','r',encoding='utf-8')
第三种:
open (r'C:UsersASUSDesktop用户.txt','r',encoding='utf-8')
读文件:
f = open(r'C:UsersfengziDesktopa.txt','r',encoding='utf-8')
f.read(4)#4是字符不是字节
data = f.read()#读取光标右边所有字符
print(data)
f.close()
bytes(字节):8位1bytes,1024bytes是1kb。
字符:一个字母就是一个字符。一个汉字也是一个字符。包括空格。
光标:
f = open(r'C:UsersfengziDesktopa.txt','r',encoding='utf-8')
f.read(4)
data = f.read()#读取光标右边所有的字符 f.close() #当你进行了第一次读取,光标的位置发生了变化,现在光标处于第四字节,当在进行读取,如果不指定参数,会读取第四个字节往后的全部内容,不包括第四个字符。
f = open(r'C:UsersfengziDesktopa.txt','r',encoding='utf-8')
f.read()
data = f.read()#读取光标右边所有字符
print(data)
f.close() #这样再去读就没有内容,因为第一次的读取已经将光标移动到了最后,当你再进行读取,光标后面是没有内容的。f = open(r'C:UsersfengziDesktopa.txt','r',encoding='utf-8')
data = f.readline(2)#这里面的数字表示读取此行的前两个字符。
print(data)
f.close() #这是按行去读,默认是读一行内容。
如何按行都读取出来:
for i in f: print(f)
写的方法:
f = open(r'C:UsersfengziDesktopa.txt','w',encoding='utf-8') #此方法只能写字符串 f.write(’哈哈哈,哈哈哈’)这样的写是会覆盖原有内容。 f.close() f = open(r'C:UsersfengziDesktopa.txt','w',encoding='utf-8') f.writelines([’你’,’好’,’美’]) 或 ((’你’,’好’,’美’))把列表或元组所有元素拼接成字符串,拼接成一行,写入文件中。但会覆盖原有内容。 f.close()
写的方法不覆盖:
f = open(r'C:UsersfengziDesktopa.txt','a',encoding='utf-8') f.write(’哈哈哈,哈哈哈’) f.close() 也可以写入列表 f.writelines([’sb’,’cvcv’,’sds’])
保存文件:
f.flush()
判断文件是否是可读的:
f.readable()
判断文件是否是可写的:
f.writable()
bytes类型文件操(汉字在windows10中占2个字节)
以bytes方式对文件进行读取:
f = open(r'C:UsersfengziDesktopa.txt',’rb’) print(f.read()) f.close
解码:
这样读取出来的是二进制,如果想转成可读的内容。再进行解码。
f = open(r'C:UsersfengziDesktopa.txt',’rb’) print(f.read().decode(‘utf-8’)) f.close
转码:
a = '你好'.encode('utf-8')
bytes类型文件写:
第一种方法:
必须要转换成二进制才能写进去。 f = open(r'C:UsersfengziDesktopa.txt',’wb’) f.write(‘你好’.encode(‘utf-8’)) f.close
第二种方法:
f = open(r'C:UsersfengziDesktopa.txt',’wb’) f.write(b’asd’) f.close
这种的只能写26个字母或数字,汉字转不进去,因为ASCII表,它只认26个英文字母。
文件的光标移动
这种是不需要手动关闭的书写格式
with open(r'C:UsersfengziDesktopa.txt',’r’,encoding=’utf-8’) as f
光标分为三种模式:
首先我们要知道的是当我们使用read读完一个文件的时候,他的光标是处于最后的。
第一种0模式:可以用于bytes类型和字符类型
with open(r'C:UsersfengziDesktopa.txt',’r’,encoding=’utf-8’) as f: f.seek(0,0)
这种模式会把光标移动在最头
第二种1模式:此模式只适用于bytes类型
f.read(1)
f.seek(1,1)
1代表相对位置,就是读了一个字符的当前位置,而后再往右移一个光标。
第三种2模式:此模式只适用于bytes类型
f.read(1)
f.seek(2)
2代表光标移动到最后。
常用汉字在utf-8中占3个字节。生僻字占得更多。
持续刷新文件,等同于tail –f
监测端:
# tail -f /var/log/message | grep '404'
import time
with open(r'C:UsersfengziDesktopa.txt', 'r', encoding='utf-8') as f:
while True:
data = f.readline()
if '404' in data:
print(data)
else:
time.sleep(0.05)
写入端:
open(r'C:UsersfengziDesktopa.txt', 'a', encoding='utf-8') as f: f.write('qwewq4304aaa')