1. 程式人生 > >Python3文件操作詳解 Python3文件操作大全

Python3文件操作詳解 Python3文件操作大全

list 寫到 int 模擬 想是 swa test fad 漢字

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 #Author:sking
  4 #Python3文件操作詳解  Python3文件操作大全
  5 
  6 """
  7 test_file.txt
  8 文件內容如下:
  9 打印字符串第一個字符
 10 
 11 打印字符串第二個字符
 12 """
 13 #打開文件test_file.txt
 14 f = open(test_file.txt, r+) #f是文件的文件句柄,它是在內存中的,是內存中的一個對象
 15 data = f.read()
 16 print
(data) 17 """ 18 data結果: 19 打印字符串第一個字符 20 21 打印字符串第二個字符 22 """ 23 data2 = f.read() #再讀一次文件 24 print("data2=", data2) #data2= 25 # 此時的結果是data2= ,也就是此時讀取的data2為空,為什麽? 26 # 因為第一次data讀的時候文件光標是從頭開始一直讀到最後的,再次讀的時候, 27 # 是從此時光標所在的位置(此時光標在最後面)開始讀取,因為光標已經在最後了, 28 # 後面已經沒有任何內容了,當然data2就讀不出來數據了 29 #
可以用seek重新定位光標的位置 30 f.seek(0) #將光標定位到文件的開始位置 31 data3 = f.read() 32 print(data3) 33 """ 34 data3結果: 35 打印字符串第一個字符 36 37 打印字符串第二個字符 38 """ 39 #寫文件write 40 #f = open(‘test_file.txt‘, ‘w‘) #如果是‘w‘寫的模式的時候,系統會自動創建一個這個名字的文件, 41 # 如果該目錄下有這個名字的文件,系統會直接覆蓋掉原來的文件,原來的文件及內容就不存在了,所以這點一定要註意。 42 #f.write(‘\n\n寫入字符串第三個字符‘)
43 f.seek(0) #seekable()判斷文件內容是否可以進行seek操作,因為有些文件是不可以進行seek的 44 data4 = f.read() 45 print(data4) 46 f.close() 47 """ 48 打印字符串第一個字符 49 50 打印字符串第二個字符 51 52 寫入字符串第三個字符 53 """ 54 #向文件追加內容 55 f = open(test_file.txt, a) #‘a‘是append 追加,但是不能讀取文件 56 f.write(\n\nhaha) 57 print(f.readable()) #False 判斷文件是否可讀 58 f.close() 59 #讀取一行內容 60 f = open(test_file.txt, r) 61 data = f.readline() 62 print(data) # 打印字符串第一個字符 63 #讀取多行 64 data2 = f.readlines() 65 print(data2) 66 67 68 #讀取到第3行 69 for index, line in enumerate(f.readlines()): #僅適合讀取小文件 70 print(line.strip()) 71 if index == 2: 72 break; 73 f.close() 74 #讀取大文件(推薦使用) 75 f = open(test_file.txt, r) 76 for line in f: #這樣寫的效果就是逐行讀取文件中的內容,並且內存中始終僅保存讀取的這一行內容 此時的f是一個叠代器 77 print(line) 78 f.close() 79 #查看文件遊標所在的位置 80 f = open(test_file.txt, r) 81 print(f.tell()) #0 82 print(f.read(5)) 83 print(f.tell()) #10 因為一個漢字占2個字節,所以這裏顯示的是10 84 f.close() 85 f2 = open(test_file2.txt, r) 86 print(f2.tell()) #0 87 print(f2.read(5)) 88 print(f2.tell()) #5 因為一個英文占1個字節,所以這裏顯示的是5 89 f2.close() 90 91 92 f = open(test_file.txt, r) 93 print(f.encoding) #cp936 #查看文件編碼 94 print(f.name) # test_file.txt 查看文件名 95 96 f.close() 97 #實時存儲數據 98 f.write("sdfadf") #因為代碼執行的過程中並不是出現依據寫到硬盤的代碼就立馬開始向硬盤存儲。 99 #系統有一個閥門限制,系統會在內存中開辟一塊用來臨時存儲的區域,當臨時存儲區域的數據達到一定值時,才會從內存存到硬盤上。 100 #所以並不是執行一行寫的代碼後,硬盤就一定已經保存了該結果,很可能該結果還沒有被保存。 101 f.flush() 102 print(f.flush()) #None 103 104 105 106 107 """ 108 一、文件操作 109 1.文件處理的流程 110 111 112 1)打開文件,得到文件句柄並賦值給一個變量 113 114 2)通過句柄對文件進行操作 115 116 3)關閉文件 117 118 例如: 119 120 f = open(‘chenli.txt‘) #打開文件 121 first_line = f.readline() 122 print(‘first line:‘,first_line) #讀一行 123 data = f.read()# 讀取剩下的所有內容,文件大時不要用 124 print(data) #打印讀取內容 125 f.close() #關閉文件 126 127 128 2.文件操作基本用法 129 1)基本用法: 130 131 file_object = open(file_name, access_mode = ‘r’, buffering = -1) 132 133 open函數有很多的參數,常用的是file_name,mode和encoding 134 135 file_name:打開的文件名,若非當前路徑,需指出具體路徑 136 access_mode文件打開模式 137 buffering的可取值有0,1,>1三個,0代表buffer關閉(只適用於二進制模式),1代表line buffer(只適用於文本模式),>1表示初始化的buffer大小; 138 encoding表示的是返回的數據采用何種編碼,一般采用utf8或者gbk; 139 140 141 142 143 2)文件打開模式 144 145 r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】 146 w,只寫模式【不可讀;不存在則創建;存在則清空內容】 147 x, 只寫模式【不可讀;不存在則創建,存在則報錯】 148 a, 追加模式【不可讀文件,不存在則創建;存在則只追加內容】,文件指針自動移到文件尾。 149 "+" 表示可以同時讀寫某個文件 150 151 r+, 讀寫【可讀,可寫】 152 w+,寫讀【可讀,可寫】,消除文件內容,然後以讀寫方式打開文件。 153 x+ ,寫讀【可讀,可寫】 154 a+, 寫讀【可讀,可寫】,以讀寫方式打開文件,並把文件指針移到文件尾。 155 "b"表示以字節的方式操作,以二進制模式打開文件,而不是以文本模式。 156 157 158 159 rb 或 r+b 160 wb 或 w+b 161 xb 或 w+b 162 ab 或 a+b 163 註:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼 164 165 166 167 3)以讀r的方式打開文件 168 169 170 171 #!/usr/bin/env python 172 # -*- coding:utf-8 -*- 173 f=open(‘1.txt‘,encoding=‘utf-8‘,mode=‘r‘) 174 print(f) 175 data1=f.read() 176 print(data1) 177 178 179 1.txt 180 181 55542342 182 123 183 輸出: 184 185 <_io.TextIOWrapper name=‘1.txt‘ mode=‘r‘ encoding=‘utf-8‘> 186 55542342 187 123 188 189 190 補充: 191 192 復制代碼 193 1)python中有三個方法來處理文件內容的讀取: 194 read() #一次讀取全部的文件內容。返回字符串 195 196 readline() #每次讀取文件的一行。 197 198 readlines() #讀取文件的所有行,返回一個字符串列表。 199 200 2)print(f.readable()) #判斷文件是否是r模式打開的 201 202 3)print(f.closed)    #判斷文件是否是關閉狀態 203 204 4)python中在文本文件內容移動的操作 205 file.seek(offset,whence=0) #從文件中給移動指針,從whence(0起始,1當前,2末尾)偏移offset個字節,正往結束方向移動,負往開始方向移動 206 file.tell()          #返回當前文件中的位置。獲得文件指針位置 207 208 5) file.truncate(size=file.tell()) #截取文件到最大size個字節,默認為當前文件位置 209 復制代碼 210 4)以w方式寫入文件 211 212 復制代碼 213 f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘) 214 # f=open(‘b.txt‘,‘r‘,encoding=‘utf-8‘) #以讀的方式打開文件,文件不存在則報錯 215 f=open(‘b.txt‘,‘w‘,encoding=‘utf-8‘) 216 # print(f.writable()) 217 218 f.write(‘111111\n22222222‘) 219 f.seek(0) 220 f.write(‘\n333333\n444444‘) 221 222 f.writelines([‘\n55555\n‘,‘6666\n‘,‘77777\n‘]) 223 f.close() 224 復制代碼 225 a.txt 為空 226 227 b.txt 228 229 333333 230 444444 231 55555 232 6666 233 77777 234 235 236 補充: 237 238 file.write(str) #向文件中寫入字符串(文本或二進制) 239 file.writelines(seq) #寫入多行,向文件中寫入一個字符串列表,註意,要自己加入每行的換行符 240 file.flush() #刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入. 241 242 243 5)文件修改 244 245 復制代碼 246 #!/usr/bin/env python 247 # -*- coding:utf-8 -*- 248 import os 249 read_f=open(‘b.txt‘,‘r‘) 250 write_f=open(‘.b.txt.swap‘,‘w‘) 251 for line in read_f.readlines(): 252 if line.startswith(‘1111‘): 253 line=‘2222222222\n‘ 254 write_f.write(line) 255 read_f.close() 256 write_f.close() 257 os.remove(‘b.txt‘) 258 os.rename(‘.b.txt.swap‘,‘b.txt‘) 259 復制代碼 260 261 262 3.上下文管理with語句 263 當你做文件處理,你需要獲取一個文件句柄,從文件中讀取數據,然後關閉文件句柄。 264 265 正常情況下,代碼如下: 266 267 file = open("/tmp/foo.txt") 268 data = file.read() 269 file.close() 270 這裏有兩個問題。一是可能忘記關閉文件句柄;二是文件讀取數據發生異常,沒有進行任何處理。 271 272 然而with可以很好的處理上下文環境產生的異常。下面是with版本的代碼: 273 274 with open("/tmp /foo.txt") as file: 275 data = file.read() 276 with的基本思想是with所求值的對象必須有一個__enter__()方法,一個__exit__()方法。緊跟with後面的語句被求值後,返回對象的__enter__()方法被調用,這個方法的返回值將被賦值給as後面的變量。當with後面的代碼塊全部被執行完之後,將調用前面返回對象的__exit__()方法。 277 278 279 280 補充: 281 282 模擬 tail -f access.log 283 284 復制代碼 285 #!/usr/bin/env python 286 # -*- coding:utf-8 -*- 287 288 # tail -f access.log 289 import time 290 with open(‘access.log‘,‘r‘,encoding=‘utf-8‘) as f: 291 f.seek(0,2) 292 while True: 293 line=f.readline().strip() 294 if line: 295 print(‘新增一行日誌‘,line) 296 time.sleep(0.5) 297 復制代碼 298 299 300 """ 301 """ 302 read(),readline(),readlines()的區別 303 304 假設a.txt的內容如下所示: 305 123 306 Hello 307 Welcome 308 What is the fuck... 309 310 一、read([size])方法 311 312 read([size])方法從文件當前位置起讀取size個字節,若無參數size, 313 則表示讀取至文件結束為止,它範圍為字符串對象 314 f = open("a.txt") 315 lines = f.read() 316 print(lines) 317 print(type(lines)) 318 f.close() 319 320 輸出結果: 321 Hello 322 Welcome 323 What is the fuck... 324 <type ‘str‘> #字符串類型 325 326 二、readline()方法 327 328 從字面意思可以看出,該方法每次讀出一行內容,所以,讀取時占用內存小,比較適合大文件,該方法返回一個字符串對象。 329 330 f = open("a.txt") 331 line = f.readline() 332 print(type(line)) 333 while line: 334 print line, 335 line = f.readline() 336 f.close() 337 338 輸出結果: 339 340 <type ‘str‘> 341 Hello 342 Welcome 343 What is the fuck... 344 345 三、readlines()方法讀取整個文件所有行,保存在一個列表(list)變量中,每行作為一個元素,但讀取大文件會比較占內存。 346 347 f = open("a.txt") 348 lines = f.readlines() 349 print(type(lines)) 350 for line in lines: 351 print (line) 352 f.close() 353 354 輸出結果: 355 <type ‘list‘> 356 Hello 357 Welcome 358 What is the fuck... 359 360 四、linecache模塊 361 362 當然,有特殊需求還可以用linecache模塊,比如你要輸出某個文件的第n行: 363 364 # 輸出第2行 365 text = linecache.getline(‘a.txt‘,2) 366 print text, 367 368 對於大文件效率還可以。 369 """

Python3文件操作詳解 Python3文件操作大全