Python文件操作
2018-04-16 22:22 钱先生 阅读(197) 评论(0) 编辑 收藏 举报1 # 打开文件 2 open("yesterday") 3 4 5 # 读取文件的内容 6 data = open("yesterday", encoding = "utf-8").read() # 不指定编码表,会用默认编码表.万一和文件所用编码表不一致,会乱码. 最好指定编码表. 7 print(data) 8 9 10 # 要对文件进行更多操作,需要将其封装成一个对象 11 f = open("yesterday","r",encoding = "utf-8") # 文件句柄. .r代表可读的, 这种方式是打开一个文件> 12 f1 = open("yesterday_copy","w",encoding = "utf-8") # w代表可写的,这样其实是创建一个文件. 若文件已存在,里面内容会被覆盖. 13 data = f.read() 14 data2 = f.read() 15 print(data) 16 print("=================") 17 print(data2) # 打出来为空.因为data读完后指针已经到了文件的最后面,再读data2是接着往下读的, 后面没有内容, 所以data2为空. 18 19 20 # 写, 原文件内容被覆盖 21 f.write("我爱北京天安门") # 默认文件是读模式,要先打开,才能写. 22 f1.write("我爱北京天安门,\n") 23 f1.write("天安门上太阳升") # 写出来的两行会换行 24 25 # 追加, 在原文件基础上追加 26 f2 = open("yesterday_copy","a",encoding = "utf-8") # a 代表append追加. a 不能读,只能写, 不过不会覆盖原来的文件内容. 27 f2.write("天安门上太阳升.....") 28 29 f.close() 30 f1.close() 31 f2.close() 32 33 34 # 读指定行数的文件内容 35 print(f.readline()) # 读一行 36 37 # 读五行 38 for i in range(5): 39 print(f.readline()) 40 41 42 43 # 循环读文件并打印 44 for line in f.readline(): 45 print(line) 46 47 48 # 循环读文件并打印,第十行不打印. 方法1 49 for index, line1 in enumerate(f.readline()): 50 if index == 9: 51 print("==============我是分割线==========") 52 continue 53 print(line1.strip()) 54 55 56 # 循环读文件并打印,第十行不打印. 方法2 57 count=0 58 for line in f: 59 if count==9: 60 print("===========我是分割线===========") 61 count += 1 62 continue 63 print(line) # 一行行读,且内存一次只保存一行 64 count+=1 65 66 67 # 读完文件把指针移到前面 68 print(f.tell()) # 返回当前文件指针位置 (若是0,代表指针在文件开头). 指针不是按行数计数的, 是按字符数量来计数的. 69 print(f.read(5)) # 读5个字符 70 f.seek(0) # 把指针调回到文件最开始的位置. 不是所有的文件都可以这么移.seekable()方法判断一个文件是否可移 71 72 73 # 打印文件的编码表 74 print(f.encoding) 75 76 77 # 返回文件在内存中的编号 78 print(f.fileno()) 79 80 81 # flush 刷新内存中的数据到文件或硬盘 82 print(f.flush()) 83 84 85 # 判断文件是否关闭 86 print(f.closed) 87 88 89 # 截断文件 90 f3 = open("yesterday_copy","a",encoding = "utf-8") # 模式必须是a(append) 91 f3.truncate() # 什么都不写,就是清空文件 92 f3.truncate(10) # 从文件开头截取10个字符 93 94 95 96 # 模仿进度条 97 import sys, time 98 99 for i in range(50): 100 sys.stdout.write("#") 101 sys.stdout.flush() # 一点点打印出来, 类似进度条. 若不加flush()方法, 会一下子打印出来所有的#,就不像进度条了. 102 time.sleep(1) # 每打一次休息一秒 103 104 105 106 # 读写文件 r+ 模式 107 f4 = open("yesterday_copy","r+",encoding = "utf-8") 108 print(f4.readline()) 109 print(f4.readline()) 110 print(f4.readline()) 111 f4.write("===========test=========") # 写的时候是从最后面开始追加. 不论此时读到第几行(不论指针是哪里) 112 print(f4.readline()) 113 f4.close() 114 115 116 # 写读 w+ 模式 117 f5 = open("yesterday_copy2","w+",encoding = "utf-8") 118 print(f5.readline()) # 没有读到内容,因为文件刚刚创建是空的. 119 print(f5.readline()) 120 print(f5.readline()) 121 print(f5.tell()) 122 f5.write("=========test============") # 写读模式是先创建一个文件, 再写内容. 写的内容会覆盖掉后面的内容,. 123 print(f5.readline()) 124 f5.close() 125 126 127 # 二进制读取 rb 模式 128 f6 = open("yesterday_copy2","rb") # 二进制不能传encoding参数 129 print(f6.readline()) 130 f6.close() 131 132 # 什么情况会用rb 模式? 133 # 1. 网络传输时会用到. 网络传输(即使是字符串)只能用rb模式. 134 # 2. 迅雷等下载的文件是二进制文件. 135 136 137 # 二进制写 wb 模式 138 f7 = open("yesterday_copy2","wb") # 二进制不能传encoding参数 139 f7.write("hello binary\n") # 字符串写不进去. 要用bytes写. 140 f7.write("hello binary\n".encode()) # 字符串转换成二进制
1 # 实现边读边写(写的过程中可以修改,写到一个新的文件中去) 2 f = open('yesterday2',"r",encoding="utf-8") 3 f_new = open('yesterday2.bak',"w",encoding="utf-8") # 在内存中修改,改好再写出去 4 5 ''' 6 for line in f: 7 if"肆意的快乐等我享受" in line: 8 line = line.replace("肆意的快乐等我享受","肆意的快乐等alex享受") 9 f_new.write(line) 10 else: 11 f_new.write(line) 12 ''' 13 14 # 优化后代码 15 for line in f: 16 if"肆意的快乐等我享受" in line: 17 line = line.replace("肆意的快乐等我享受","肆意的快乐等alex享受") 18 f_new.write(line)
1 # 引用参数 2 import sys 3 f = open('yesterday2',"r",encoding="utf-8") 4 f_new = open('yesterday2.bak',"w",encoding="utf-8") # 在内存中修改,改好再写出去 5 6 find_str = sys.argv[1] 7 replace_str = sys.argv[2] 8 9 # 优化后代码 10 for line in f: 11 if find_str in line: 12 line = line.replace(find_str,replace_str) 13 f_new.write(line)
1 # with语句 2 # 为了避免打开文件后忘记关闭,可以通过管理上下文, 实现当with代码块执行完毕时,内部自动关闭并释放文件资源 3 with open('yesterday2','r',encoding='utf-8')as f: # 其它对文件f的操作照常 4 for line in f: 5 print(line) 6 7 # with还支持对多个文件的上下文进行管理 8 with open('yesterday2','r',encoding='utf-8')as f, \ 9 open('yesterday2', 'r', encoding='utf-8')as f2: 10 11 12 # python代码规范,一行代码不应超过80个字符
1 def replace(arg1): 2 for line in user_list2.readlines(): 3 if name == line.split(',')[0]: 4 line = line.replace(line.split(',')[2], arg1+'\n') 5 temp.write(line) 6 else: 7 temp.write(line) 8 9 10 #TODO r+ /a+说是可读可写,但是下面这段代码, 如果把user_list2改成a+模式, 则文件的数据并没有读取成功. 11 # r+, a+到底是怎么工作的 12 13 14 15 user_list2 = open('user_list2', 'r+', encoding='utf-8') 16 temp = open('temp', 'a+', encoding='utf-8') 17 18 name = input('name') 19 replace('5000') 20 21 user_list2.close() 22 temp.close()