文件操做java
通常步骤1. 文件打开 2. 文件操做 3. 文件关闭python
1. 打开文件 ruby
使用open(文件名(绝对路径), 打开模式, 编码) socket
文件打开的模式有:编码
r: 只读模式(默认)spa
w: 只写模式 (不可读,文件不存在就建立,存在则清空)指针
x: 只写模式 (不可读,文件不存在就建立,存在则报错)code
a: 追加模式 (不可读,若是文件不存在就建立,若是存在则在原文件后面追加)blog
以上都是以字符串方式打开内存
'+' 表示能够同时读写某个文件
'b' 表示以字节的方式操做 -> 后续socket部分会用到
文件的打开方式有 普通打开方式 和 二进制打开方式
普通打开:python内部将0101自动转换成字符串
二进制打开:'b'模式加str - bytes 转换 + 手动encoding='utf-8'
1 # 打开一个文件使用open(文件名(绝对路径),打开模式,编码) 2 # 文件打开默认只读模式('r') 3 # 4 f = open('test.log', 'r') 5 data = f.read() 6 f.close() 7 print(data) 8 9 f = open('test.log', 'r') 10 data = f.write('ehhh') 11 f.close() 12 print(data) 13 # 在只读状态下写入,报错 Traceback (most recent call last): 14 # File "D:/NaomiPyer/naomi_01/mod8/file_stuff.py", line 21, in <module> 15 # data = f.write('ehhh') 16 # io.UnsupportedOperation: not writable 17 18 # 只写 - 文件不可读,只写状况下,文件不存在则建立,存在则清空内容写入 19 f = open('test1.log', 'w') 20 f.write('ruby') 21 f.close() 22 # 执行后自动建立了有'ruby'内容的文件 23 f = open('test1.log', 'w') 24 f.write('python') 25 f.close() 26 # 修改写入内容再次执行,文件内容更新为新输入的内容 27 f = open('test1.log', 'w') 28 f.read() 29 # 报错, 不可读 => io.UnsupportedOperation: not readable 30 31 # x 只写 - 不可读,不存在则建立,存在则报错 32 f = open('test1.log', 'x') 33 f.write(' ') 34 f.close() 35 # 文件已存在,报错 => FileExistsError: [Errno 17] File exists: 'test1.log' 36 37 # a 追加 - 不可读,不存在则建立,存在则只追加内容 38 f = open('test.log', 'a') 39 f.write('java') 40 f.close() 41 # 'test.log'文件里面追加了java 内容 42 43 # 以上为文件的基本打开方式 44 # 一般读取到的文件数据,类型是str, 若是要转换为字节,能够用types() 45 f = open('test.log', 'r') 46 data = f.read() 47 a = bytes(data, encoding='utf-8') 48 print(a) 49 # 这样文件里的数据就以bytes输出了 => b'zen of pythonjava' 50 51 # 以字节方式打开 52 # 1. 只读 53 f = open('test.log', 'rb') 54 data = f.read() 55 print(data) 56 str_data = str(data, encoding='utf-8') 57 print(str_data) 58 # 不须要编码 59 60 # 2. 只写 61 f = open('test.log', 'wb') 62 f.write(bytes('牛奶', encoding='utf-8')) 63 f.close() 64 # 写入的字符串"牛奶"须要用编码变为bytes写入 65 f = open('test1.log', 'wb') 66 str_data = '牛奶' 67 bytes_data = bytes(str_data, encoding='utf-8') 68 f.write(bytes_data) 69 f.close() 70 # 以字节的方式写入
'+'
r+ 读写
1 # r+ 2 # w, 末尾追加,指针最后 3 f = open('test1.log', 'r+', encoding='utf-8') 4 5 # 指针为0, 起始位置 6 print(f.tell()) 7 8 data = f.read(3) # read(3) 读取3个字符(中文9个字节) 9 print(type(data), data) 10 print(f.tell()) 11 # f.write('草莓') 12 # f.seek(0) 13 # data = f.read() 14 f.read(2) 15 print(f.tell()) 16 print(type(data), data) 17 f.close() 18 # 指针 读取完数据,继续读取的时候从上次停下的位置开始继续读取 19 # 经过tell() 来获取指针 20 # 经过seek() 来调整指针 [seek以字节来讲] 21 # 写入的时候,指针会调到最后
w+ 写读
1 # w+,先清空,写完内容以后才能够读 2 # 写入完毕,指针到最后 3 f = open('test1.log', 'w+', encoding='utf-8') 4 data = f.read() 5 f.close() 6 print(data) 7 # 没有数据,由于写读是先写入再读取,没有写入的内容 8 f = open('test1.log', 'w+', encoding='utf-8') 9 f.write('鸡蛋') 10 data = f.read() 11 f.close() 12 print(data) 13 # 仍是没有内容,由于写完以后指针已经到文件末尾 14 f = open('test1.log', 'w+', encoding='utf-8') 15 f.write('鸡蛋') 16 f.seek(0) 17 data = f.read() 18 f.close() 19 print(data) 20 # 写入数据后,调整指针到起始位置,读到文件内容
x+ 写读
基本和 w+ 同样,不一样的是,若是文件已经存在,会报错。
a+ 写读
1 # a+ 2 # 写时追加,放到最后 3 f = open('test.log', 'a+', encoding='utf-8') 4 print(f.tell()) 5 data = f.read() 6 print(data) 7 f.seek(0) 8 data = f.read() 9 print(data) 10 f.close() 11 # 由于a是追加,其实在打开文件的同时,指针已经到了文件末尾 12 # => 6 空 牛奶
几种读写方式共有的特色
1 # 从开始向后读 2 # 写,追加,指针调到最后 3 f.tell() # 获取指针的位置 4 f.seek(num) # 调整指针的位置 5 data = f.read(1) # 读取一个字符(中文3个字节) 6 print(data) 7 print(f.tell()) # 向后移了三个字节 8 f.write('content') # 在尾部追加,而且指针移动到最后 9 f.close()
在不肯定每一个读写方式特色的时候,能够经过tell(), seek(), read(), write() 方法来判断
'b' 表示以字节的方式操做
wb w+b
rb r+b
xb x+b
ab a+b
上述是和在底层数据交流的时候,以字节的方式读写,默认以字节方式打开,拿到字节数据后转化为字符串进行操做,写入的时候一样转换为字节写入。
文件的操做:
1 # close() 关闭一个文件 2 3 # fileno() 文件描述符(后续讲) 4 5 # flush() 文件内部缓冲区 6 # 写入内容以后,f.flush()能够将内存里写入的东西刷入到硬盘里 7 8 # read(1) 读取内容 9 10 # readable() 判断是否可读 11 12 # readline(1) 仅读取一行内容,再次执行会从第一次指针停下来的位置继续往下读取 13 14 # seek() 调整指针 15 16 # truncate() 截取, 依赖于指针 17 18 f = open("test.log", 'r', encoding='utf-8') 19 # f.read() 20 for line in f: 21 print(line) 22 # 效果同readline(),且比readline()更好用 23 24 # 关闭文件 close() 25 # 每次文件读写都要close(),比较麻烦,能够经过with语句来自动关闭 26 with open('test.log', 'r') as f: 27 f.read() 28 # 读取数据时,上面代码自动帮助close()文件 29 # python 2.7 及之后版本,能够同时还打开两个文件 30 with open('log1', 'r') as obj1, open('log2', 'r') as obj2: 31 pass 32 # 以读方式打开源文件,同时打开新文件w,能够一行一行读取而后一行一行写入新文件。大大节省了内存。 33 with open('源文件', 'r') as obj1, open('新文件', 'w') as obj2: 34 for line in obj1: 35 obj2.write(line)
文件关闭后不会保存指针,可是关闭前,文件读到哪儿,指针就指到哪儿。
若是须要记录文件读取的位置,咱们能够将tell()指针位置先保存起来,下一次打开的时候seek()一下从新读取