Python 【文件的讀寫】


文件讀寫

A 讀取文件

 

讀文件三步:開——讀——關。
file1 = open('/Users/Ted/Desktop/test/abc.txt','r',encoding='utf-8')
第一個參數是文件的保存地址
第二個參數表示打開文件時的模式(r(讀),w(寫入),a(追加))
第三個參數encoding='utf-8',表示的是返回的數據采用何種編碼,一般采用utf-8或者gbk
——————————————————————————————
mac
open('/Users/Ted/Desktop/test/abc.txt'') #絕對路徑
open('abc.txt') #相對路徑
#相對路徑也可以寫成open('./abc.txt')

windows
Windows系統里,常用\來表示絕對路徑, /來表示相對路徑
C:\Users\Ted\Desktop\test\abc.txt #\在Python中是轉義字符,Windows的絕對路徑通常要稍作處理
寫成以下兩種格式

open('C:\\Users\\Ted\\Desktop\\test\\abc.txt')
#將'\'替換成'\\'

open(r'C:\Users\Ted\Desktop\test\abc.txt')
#在路徑前加上字母
——————————————————————————————
獲取文件路徑方法
用VS Code打開文件夾,在文件點擊右鍵
或者
將文件拖入終端窗口,獲得文件的絕對路徑
——————————————————————————————
B 寫入文件

 

【第1步-開】以寫入的模式打開文件。
file1 = open('/Users/Ted/Desktop/test/abc.txt','w',encoding='utf-8')

【第2步-寫】往文件中寫入內容,使用write()函數。
file1.write('張無忌\n')

#file1 = open('/Users/Ted/Desktop/test/abc.txt', 'a',encoding='utf-8')
#以追加的方式打開文件abc.txt
file1.write('張無忌\n')
#把字符串'張無忌'寫入文件file1

【第3步-關】還是要記得關閉文件,使用close()函數
file1.close()

#注意事項:
1.write()函數寫入文本文件的也是字符串類型。
2.在'w'和'a'模式下,如果你打開的文件不存在,那么open()函數會自動幫你創建一個
————————————————————————————————————————
為了避免打開文件后忘記關閉,占用資源或
當不能確定關閉文件的恰當時機的時候,我們可以用到關鍵字with

# 普通寫法

1 file1 = open('abc.txt','a') 
2 file1.write('張無忌') 
3 file1.close()

# 使用with關鍵字的寫法

1 with open('abc.txt','a') as file1:
2 #with open('文件地址','讀寫模式') as 變量名:
3     #格式:冒號不能丟
4     file1.write('張無忌') 
5     #格式:對文件的操作要縮進
6     #格式:無需用close()關閉

 

—————————————————————————————————————————
scores.txt
羅恩 23 35 44
哈利 60 77 68 88 90
赫敏 97 99 89 91 95 90
馬爾福 100 85 90

 1 file = open('./scores.txt','r',encoding='utf-8') 
 2 file_lines = file.readlines()   #函數readlines(),“按行讀取”
 3 file.close()
 4 
 5 final_scores = [] 
 6 
 7 for i in file_lines:
 8     data =i.split()      #split()把字符串分開,把字符串切分成更細的一個個的字符串                          
 9     sum = 0                    
10     for score in data[1:]:     #遍歷列表中第1個數據和之后的數據
11         sum = sum + int(score)   #然后依次加起來,但分數是字符串,所以要轉換    
12     result = data[0]+str(sum)+'\n'    #結果就是學生姓名和總分
13     final_scores.append(result)   #每統計一個學生的總分,就把姓名和總分寫入空列表
14 
15 winner = open('./winner.txt','w',encoding='utf-8') 
16 winner.writelines(final_scores)  #writelines()函數,此處final_scores是一個列表,write()的參數必須是一個字符串,而writelines()可以是序列
17 winner.close()

——————————————————————
擴展
join()函數,字符串合並

語法:str.join(sequence)
str代表在這些字符串之中,你要用什么字符串連接
sequence代表數據序列

1 a=['c','a','t']
2 b=''
3 print(b.join(a))
4 c='-'
5 print(c.join(a))
6 cat 7 c-a-t

######################################################
# 下面注釋掉的代碼,皆為檢驗代碼(驗證每一步的思路和代碼是否達到目標,可解除注釋后運行)。

 1 file1 = open('winner.txt','r',encoding='utf-8') 
 2 file_lines = file1.readlines() 
 3 file1.close()
 4 
 5 dict_scores = {}
 6 list_scores = []
 7 final_scores = []
 8 
 9 # print(file_lines) 
10 # print(len('\n'))
11 
12 # 打印結果為:['羅恩102\n', '哈利383\n', '赫敏570\n', '馬爾福275\n']
13 # 經過測試,發現'\n'的長度是1。所以,名字是“第0位-倒數第5位”,分數是“倒數第4位-倒數第二位”。
14 # 再根據“左取右不取”,可知:name-[:-4],score-[-4:-1]
15 
16 for i in file_lines:  # i是字符串。
17     print(i)
18     name = i[:-4]  # 取出名字(注:字符串和列表一樣,是通過偏移量來獲取內部數據。)
19     score = int(i[-4:-1])  # 取出成績
20     print(name)
21     print(score)
22     dict_scores[score] = name  # 將名字和成績對應存為字典的鍵值對(注意:這里的成績是鍵)
23     list_scores.append(score)
24 
25 # print(list_scores)
26 list_scores.sort(reverse=True)  # reverse,逆行,所以這時列表降序排列,分數從高到低。
27 # print(list_scores)
28 
29 for i in list_scores:
30     result = dict_scores[i] + str(i) + '\n'
31     # print(result)
32     final_scores.append(result)
33 
34 print(final_scores)  # 最終結果
35 
36 winner_new = open('winner_new.txt','w',encoding='utf-8') 
37 winner_new.writelines(final_scores)
38 winner_new.close()

錦瑟
[唐] 李商隱

錦瑟無端五十弦,
一弦一柱思華年。
庄生曉夢迷蝴蝶,
望帝春心托杜鵑。
滄海月明珠有淚,
藍田日暖玉生煙。
此情可待成追憶,
只是當時已惘然。

 

 

 1 list_test = ['一弦一柱思華年。\n','只是當時已惘然。\n']  # 將要默寫的詩句放在列表里。
 2 
 3 with open ('poem2.txt','r',encoding='utf-8') as f:
 4     lines = f.readlines()
 5 print(lines)   #顯示完整的詩
 6 with open('poem2.txt','w',encoding='utf-8') as new:
 7     for line in lines:
 8         if line in list_test:  # 屬於默寫列表中的句子,將其替換成橫線。
 9             new.write('____________。\n')
10         else:
11             new.write(line)

 

########################################################################

csv是一種文件格式,你可以把它理解成“簡易版excel”

如果要手動新建csv文件,我們可以先新建一個excel表格,然后選擇另存為“csv”格式即可
一張csv格式的表格,我們也可以選擇另存為“excel”格式

用csv模塊讀寫csv文件

英文教程:https://docs.python.org/3.6/library/csv.html

中文教程:https://yiyibooks.cn/xx/python_352/library/csv.html#module-csv

先看案例

##########################################################################

csv文件內容:

1 import csv 2 
3 with open("test.csv",newline = '') as f: 4     reader = csv.reader(f) 5     #使用csv的reader()方法,創建一個reader對象
6     for row in reader: 7     #遍歷reader對象的每一行
8         print(row)    

 #####################################################################

往csv格式文件寫入數據

csv文件內容:

追加寫入兩行列表

1 import csv 2 with open('test.csv','a', newline='',encoding='utf-8') as f: 3     writer  = csv.writer(f) 4     writer.writerow(['4', '貓砂', '25', '1022', '886']) 5     writer.writerow(['5', '貓罐頭', '18', '2234', '3121'])

 

writerow()和writerows的區別
(1)writerow() 括號內的內容為列表;
(2)writerows() 括號內的內容為元組,且元組內的元素由兩個以上的列表組成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM