python文件讀寫編碼
Ⅰ 開啟數據分析的大門-數據收集:python對文件的操作
簡介
我是一名應屆經濟學畢業生,在學習Python語言的過程中,接觸到了數據分析,機器學習和人工智慧,並對此特別感興趣,現在我把整個學習過程記錄下來,希望和我有相同興趣和愛好的朋友們一同成長,期盼著各位專家的指導。
環境介紹
在整個過程當中,將採用Python和Excel,採用Python,是因為Python提供了豐富的開發框架和工具庫,使用Excel是因為Excel是使用非常廣泛的辦公軟體,我在Excel里將復雜的演算法簡單化,使大家快速理解各種難以理解的演算法。
在開始之前,我們已經准備好了Anaconda和Excel環境。在這里省略了這個過程。
數據獲陪碰取將通過tushare開放平台,後面我會介紹和演示如何應用tushare平台。
數據分析流程簡介
數據分析是由數據收集開始,收集的數據經過標准化處理和整理後,通過各種演算法,進行數據分析,目的是為了總結過去的 歷史 數據,在數據趨勢上預測未來的走勢,同時對現存的環境進行優化。
我們今天先從數據收集開始。
數據收集需要應用到Python對文件的讀寫操作。
下面這段代碼以只讀方式採用』UTF-8』編碼方式打開當前目錄下的text1.txt文件,並輸出到屏幕上。操作完畢後,關閉文件。
小貼士:在從tushare平台獲取數據時,每個用戶會分配到一個key,我們可以把這個key封裝到這個文件里。為的是數據安全和便利性。
Python對數據的處理主要是csv文件格式,Excel和資料庫。今天我們主要針對csv文蘆緩談件進行操作。為的是盡快開始我們的數據分析之旅。後面在適當的時候,我來完成對Excel和資料庫的操作。
Python 讀取csv文件有很多種方法,我們這里採用PANDAS庫,下面是讀取csv文件代碼:
下面這段代碼先生成數據列表,然後寫入csv文件。
好了,到現在為止,Python對數據收集的基礎哪團工作就算完成了,Python對文件操作有很多技巧,不是我們這一系列的重點,就不一一介紹了,有興趣的夥伴可以查閱相關文檔。
Ⅱ python 讀取文本里有多種編碼
讀取ANSI編碼文件
建立一個文件test.txt,文件格式用ANSI,內容為:
abc中文
用Python來讀取
# coding=gbk
print open("Test.txt").read()
結果:abc中文
讀取utf-8編碼文件(無BOM)
把文件格式改成UTF-8:
結果:abc涓 枃
顯然,這里需要解碼:
# -*- coding: utf-8 -*-
import codecs
print open("Test.txt").read().decode("utf-8")
結果:abc中文
讀取utf-8編碼文件(有BOM)
某些軟體在保存一個以UTF-8編碼的文件時,默認會在文件開始的地方插入三個不可見的字元(0xEF 0xBB 0xBF,即BOM)。在有些軟體可以控制是否插入BOM。如果在有BOM的情況下,在讀取時需要自己去掉這些字元,python中的codecs mole定義了這個常量:
Ⅲ 使用 Python 讀寫文件
有些數據是臨時的,它們在應用程序運行時存儲在內存中,然後丟棄。但是有些數據是持久的。它們存儲在硬碟驅動器上供以後使用,而且它們通常是用戶最關心的東西。對於程序員來說,編寫代碼讀寫文件是很常見的,但每種語言處理該任務的方式都不同。本文演示了如何使用 Python 處理文件數據。
在 Linux 上,你可能已經安裝了 Python。如果沒有,你可以通過發行版軟體倉庫安裝它。例如,在 CentOS 或 RHEL 上:
在 macOS 上,你可以使用 MacPorts或Homebrew安裝。在 Windows 上,你可以使用Chocolatey安裝。
一旦安裝了 Python,打開你最喜歡的文本編輯器,准備好寫代碼吧。
如果你需要向一個文件中寫入數據,記住有三個步驟:
這與你在計算機上編碼、編輯照片或執行其他操作時使用的步驟完全相同。首先,打開要編輯的文檔,然後進行編輯,最後關閉文檔。
在 Python 中,過程是這樣的:
這個例子中,第一行以 寫 模式打開了一個文件,然後用變數 f 表示,我使用了 f 是因為它在 Python 代碼中很常見,使用其他任意有效變數名也能正常工作。
在打開文件時,有不同的模式:
第二行表示向文件中寫入數據,本例寫入的是純文本,但你可以寫入任意類型的數據。
最後一行關閉了文件。
對於快速的文件交互,常用有一種簡短的方法可以寫入數據。它不會使文件保持打開狀態,所以你不必記得調用 close 函數。相反,它使用 with 語法:
如果你或你的用戶需要通過應用程序需要向文件中寫入一些數據,然後你需要使用它們,那麼你就需要讀取文件了。與寫入類似,邏輯一樣:
同樣的,這個邏輯反映了你一開始使用計算機就已知的內容。閱讀文檔,你可以打開、閱讀,然後關閉。在計算機術語中,「打開」文件意味著將其載入到內存中。
實際上,一個文本文件內容肯定不止一行。例如,你需要讀取一個配置文件、 游戲 存檔或樂隊下一首歌曲的歌詞,正如你打開一本實體書時,你不可能立刻讀完整本書,代碼也只能解析已經載入到內存中的文件。因此,你可能需要遍歷文件的內容。
示例的第一行指明使用 讀 模式打開一個文件,然後文件交由變數 f 表示,但就像你寫數據一樣,變數名是任意的。 f 並沒有什麼特殊的,它只是單詞 「file」 的最簡表示,所以 Python 程序員會經常使用它。
在第二行,我們使用了 line ,另一個任意變數名,用來表示 f 的每一行。這告訴 Python 逐行迭代文件的內容,並將每一行的內容列印到輸出中(在本例中為終端或IDLE)。
就像寫入一樣,使用 with 語法是一種更簡短的方法讀取數據。即不需要調用 close 方法,方便地快速交互。
使用 Python 有很多方法向文件寫入數據,包括用 JSON、YAML、TOML等不同的格式寫入。還有一個非常好的內置方法用於創建和維護sqlite資料庫,以及許多庫來處理不同的文件格式,包括圖像、音頻和視頻等。
via: https://opensource.com/article/21/7/read-write-files-python
作者:Seth Kenlon選題:lujun9972譯者:MjSeven校對:turbokernel
Ⅳ python3二進制文件讀寫直接加b不行嗎
二進制模式,通常用來讀取圖片、視頻等二進制文件。注意,它在讀寫的時候是以bytes類型讀寫的,因此獲得的是一個bytes對象而不是字元串。在這個讀寫過程中,需要自己指定編碼格式。在使用帶b的模式時一定要注意傳入的數據類型,確保為bytes類型。
s = 'this is a test'
b = bytes(s,encoding='utf-8')
f = open('test.txt','w')
f.write(s)
##這樣沒問題,正常寫入了文件。
##-------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')
f = open('test.txt','wb') ##注意多了個b
f.write(s)
##報錯
TypeError: a bytes-like object is required, not 'str'
##意思是它需要一個bytes類型數據,你卻給了個字元串
##---------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')
f = open('test.txt','wb') ##注意多了個b
f.write(b) ##將變數b傳給它,b是個bytes類型
二、 + 模式:
對於w+模式,在讀寫之前都會清空文件的內容,建議不要使用!
對於a+模式,永遠只能在文件的末尾寫入,有局限性,建議不要使用!
對於r+模式,也就是讀寫模式,配合seek()和tell()方法,可以實現更多操作。
三、 編碼問題
要讀取非UTF-8編碼的文件,需要給open()函數傳入encoding參數,例如,讀取GBK編碼的文件:
>>> f = open('gbk.txt', 'r', encoding='gbk')
>>> f.read()
'GBK'
遇到有些編碼不規范的文件,可能會拋出UnicodeDecodeError異常,這表示在文件中可能夾雜了一些非法編碼的字元。遇到這種情況,可以提供errors參數,表示如果遇到編碼錯誤後如何處理。
>>> f = open('gbk.txt', 'r', encoding='gbk', errors='ignore')
四、 文件對象操作
每當我們用open方法打開一個文件時,將返回一個文件對象。這個對象內置了很多操作方法。下面假設,已經打開了一個f文件對象。
1. f.read(size)
讀取一定大小的數據, 然後作為字元串或位元組對象返回。size是一個可選的數字類型的參數,用於指定讀取的數據量。當size被忽略了或者為負值,那麼該文件的所有內容都將被讀取並且返回。
f = open("1.txt", "r")
str = f.read()
print(str)
f.close()
如果文件體積較大,請不要使用read()方法一次性讀入內存,而是read(512)這種一點一點的讀。
2. f.readline()
從文件中讀取一行n內容。換行符為' '。如果返回一個空字元串,說明已經已經讀取到最後一行。這種方法,通常是讀一行,處理一行,並且不能回頭,只能前進,讀過的行不能再讀了。
f = open("1.txt", "r")
str = f.readline()
print(str)
f.close()
3. f.readlines()
將文件中所有的行,一行一行全部讀入一個列表內,按順序一個一個作為列表的元素,並返回這個列表。readlines方法會一次性將文件全部讀入內存,所以也存在一定的風險。但是它有個好處,每行都保存在列表裡,可以隨意存取。
f = open("1.txt", "r")
a = f.readlines()
print(a)
f.close()
4. 遍歷文件
實際上,更多的時候,我們將文件對象作為一個迭代器來使用。
# 打開一個文件
f = open("1.txt", "r")
for line in f:
print(line, end='')
# 關閉打開的文件
f.close()
這個方法很簡單, 不需要將文件一次性讀出,但是同樣沒有提供一個很好的控制,與readline方法一樣只能前進,不能回退。
幾種不同的讀取和遍歷文件的方法比較:如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復調用read(size)比較保險;如果是配置文件,調用readlines()最方便。普通情況,使用for循環更好,速度更快。
5. f.write()
將字元串或bytes類型的數據寫入文件內。write()動作可以多次重復進行,其實都是在內存中的操作,並不會立刻寫回硬碟,直到執行close()方法後,才會將所有的寫入操作反映到硬碟上。在這過程中,如果想將內存中的修改,立刻保存到硬碟上,可以使用f.flush()方法,但這可能造成數據的不一致。
# 打開一個文件
f = open("/tmp/foo.txt", "w")
f.write("Python 是一種非常好的語言。
我喜歡Python!!
")
# 關閉打開的文件
f.close()
6. f.tell()
返迴文件讀寫指針當前所處的位置,它是從文件開頭開始算起的位元組數。一定要注意了,是位元組數,不是字元數。
7. f.seek()
如果要改變位置指針的位置, 可以使用f.seek(offset, from_what)方法。seek()經常和tell()方法配合使用。
from_what的值,如果是0表示從文件開頭計算,如果是1表示從文件讀寫指針的當前位置開始計算,2表示從文件的結尾開始計算,默認為0,例如:
offset:表示偏移量。
seek(x,0) : 從起始位置即文件首行首字元開始移動 x 個字元
seek(x,1) : 表示從當前位置往後移動x個字元
seek(-x,2):表示從文件的結尾往前移動x個字元
看一個例子:
>>> f = open("d:\1.txt", "rb+")
>>> f.write(b"1232312adsfalafds")
17
>>> f.tell()
17
>>> f.seek(5)
5
>>> f.read(1)
b'1'
>>> f.seek(-3, 2)
14
>>> f.read(1)
b'f'
8. f.close()
關閉文件對象。當處理完一個文件後,調用f.close()來關閉文件並釋放系統的資源。文件關閉後,如果嘗試再次調用該文件對象,則會拋出異常。忘記調用close()的後果是數據可能只寫了一部分到磁碟,剩下的丟失了,或者更糟糕的結果。也就是說大象塞進冰箱後,一定不要忘記關上冰箱的門。
Ⅳ Python中的文件讀寫-理論知識
Python處理兩種不同類型的文件:二進制文件和文本文件。了解兩者之間的差異很重要,因為它們的處理方式不同。
二進制文件
在正常計算機使用期間使用的大多數文件實際上是二進制文件,而不是文本。比如:Microsoft Word .doc文件實際上是一個二進制文件,即使它只有文本。
二進制文件的其他示例包括:
圖像文件,包括.jpg,.png,.bmp,.gif,等。
資料庫文件包括.mdb,.frm和.sqlite
文件,包括.doc,.xls,.pdf或者其他文件。
那是因為這些文件都有特殊處理的要求,需要特定類型的軟體來打開它。例如,您需要Excel來打開.xls文件,並使用資料庫程序來打開.sqlite文件。
文本文件
一方面,沒有特定的編碼,可以通過沒有任何特殊處理的標准文本編輯器打開。但是,每個文本文件都必須遵守一組規則:
文本文件必須是可讀的。他們可以(並且經常會)包含許多特殊編碼,尤其是在HTML或其他標記語言中,但您仍然可以說出它的含義
文本文件中的數據按行組織。在大多數情況下,每一行都是一個獨特的元素,無論是指令行還是命令。
此外,文本文件在每行的末尾都有一個看不見的字元,這使文本編輯器知道應該有一個新行。通過編程與這些文件交互時,您可以利用該字元。在Python中,它用「 n」 表示。
在哪裡可以找到Python的文件I / O工具
在Python中工作時,您不必擔心導入任何特定的外部庫來處理文件。Python附帶有「文件庫」,文件I / O工具和實用程序是核心語言的內置部分。
但是在其他語言(如C ++)中,要處理文件,您必須通過包含正確的頭文件來啟用文件I / O工具#include <fstream>。如果您使用java編寫代碼,則需要使用該import java.io.*語句。
使用Python,就沒有必要這樣做,這是因為Python有一組內置函數,可以處理讀取和寫入文件所需的所有內容。
Ⅵ Python文件讀寫
常見的讀寫操作:
Python內置了讀寫文件的函數,用法和C是兼容的。本節介紹內容大致有:文件的打開/關閉、文件對象、文件的讀寫等。僅示例介紹 TXT 類型文檔的讀寫,也就是最基礎的文件讀寫,也需要注意編碼問題;
open() close() with open(...) as ...
看以下示例就能了解 Python 的 open() 及 close() 函數。這邊調用 read()方法可以一次讀取文件的全部內容,Python把內容讀到內存,用一個str對象表示,具體使用參見下文。
在 E 盤 python_file 文件夾下新建一 a.txt,輸入隨意,如下:
Python 操作 打開及關閉方式 如下:
注意 open() 之後 一定要 close()。但由於文件讀寫時都可能產生IOError,為了保證無論是否出錯都能正確地關閉文件,我們用 try ... finally 來實現:
python 簡化了改寫法,即用 with open(...) as ... ; 建議之後文件讀寫都用該寫法:
上面,你肯定注意到了參數 "r";該參數決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式為只讀(r)。
相關參數:
File 對象
file 為一對象,它有一些內置屬性,如下
file對象的屬性:
read() read(size) readline() readlines()
之前的例子已經接觸到了 read() 函數,該函數會會一次性讀取文件的全部內容,如果能確保文件的大小,自然可以。但若文件過大,內存就爆了,所以,可以反復調用read(size)方法,每次最多讀取size個位元組的內容;也可調用 readline() 每次讀取一行內容;而調用readlines()可以一次讀取所有內容並按行返回list。總之,根據需求來。僅以 txt 文件為例,其他的文件讀取需要特殊處理;另外,文件的格式編碼方式也需要注意;這邊僅介紹讀取方法,其他的會出專題來學習。
在D:\python_file 下新建 poet.txt;示例如下,由於一個中文會佔多個位元組,故read(size) 部分會亂碼,如:
write()
寫文件和讀文件是一樣的,唯一區別是調用open()函數時,傳入標識符'w'或者'wb'表示寫文本文件或寫二進制文件;'a' 對應的表示追加等。
如下示例,由於 write.txt 文件不存在,創建該文件並寫入:
在上例基礎上,繼續,該文件被重寫:
繼續,這次使用追加,會在文件結尾追加:
https://blog.csdn.net/msspark/article/details/86745391
https://www.cnblogs.com/tianyiliang/p/8192703.html
https://www.cnblogs.com/camilla/p/7234657.html
https://blog.csdn.net/songlh1234/article/details/83316468
https://www.php.cn/python-tutorials-412484.html
https://blog.csdn.net/weay/article/details/80946152
https://blog.csdn.net/xc_zhou/article/details/81044836
Ⅶ python讀寫有中文的文件時,是否需要設置編碼格式
需要:
with open("路徑","模式",encoding="utf8") as f:
如果不確定編碼格式,後面讀取可能會出問題
Ⅷ python 文件的打開與讀寫
/python通過解釋器內置的open()函數打開一個文件,並實現該文件與一個程序變數的關聯,open()函數格式如下:
/open()函數包含有兩個參數:文件名和打開模式.當文件與執行文件在同一大廳文件夾中,直接輸入文件名,亦可輸入文件的完整路徑.打開模式是指以何種方式打開文件,python提供了7種打開模式.
/r/w/x/a模式與b/t/+模式可以組合使悉仿悄用,比如'rt'為文睜渣本只讀.'rb'為二級制只讀.
/文件使用結束後,需要使用close()關閉文件使用許可權,釋放內存.
/當文件使用文本格式打開時,讀寫按照字元串方式,採用計算機當前編碼或指定編碼.
/當文件以二進制方式打開時,讀寫按照位元組流方式.
/python本身將文件讀取為一個行序列.
Ⅸ python讀寫文件
讀文件
1)使用open()方法打開文件,返回一個文件對象
原型:open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
舉例:f = open('test.txt', 'r')
test.txt表示文件路徑(包含文件名,這個file參數可以是絕對或者相對路徑)
r表示是讀文本文件,rb是讀二進制文本文件。(這個mode參數默認值就是r)
2)使用close()方法關閉文件
f.close()
打開後的文件必須關閉,因為文件對象會佔用系統資源,系統打開文件數量也就有限了
3)打開文件時的異常處理
f=open('test.txt', 'r')
f.read()
f.close()
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
文件讀寫時都有可能產生異常IOError(比如文件不存在),這樣其後面的f.read(),f.close()就不會調用。為保證無論是否異常都可以關閉文件,一般使用try ... finally來處理:
try:
f = open('test.txt', 'r')
f.read()
finally:
if f:
f.close()
但這種寫法過於繁瑣,所以Python引入了with語句來自動調用close()方法:
with open('test.txt', 'r') as f:
f.read()
4)讀文件 - read()、readline() 和 readlines()
read() 一次讀取整個文件,它通常用於將文件內容放到一個字元串變數中。如果文件過大,內存不夠,可以通過反復調用read(size)方法,每次最多讀取size個位元組的內容。
readline() 一次讀取文件中一行內容,可反復調用
readlines() 一次讀取所有內容並按行返回列表,該列表可以由for ... in ... 結構再進一步處理。
特別注意:
這三種方法是把每行末尾的'\n'也讀進來了,如有需要就得我們手動去掉'\n'
with open('test.txt', 'r') as f:
list = f.readlines()
for i in range(0, len(list)):
list[i] = list[i].rstrip('\n')
寫文件
1)寫文件和讀文件是一樣的,唯一區別是open文件時,傳入標識符不同,即'w'或者'wb'表示寫文本文件或寫二進制文件
f = open('test.txt', 'w')
f = open('test.txt', 'wb')
f = open('test.txt', 'a')
f.close()
特別注意:
1. 如果沒有這個文件,會自動創建一個新文件;如果有,就會先把原文件的內容清空再寫入;若不想清空原來的內容而是直接在後面追加新的內容,就用'a'這個模式
2. 寫文件,操作系統往往不會立刻把數據寫入磁碟,而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁碟。忘記調用close()的後果是數據可能只寫了一部分到磁碟,剩下的丟失了。
2)寫文件 - write()、writelines()
write()方法和read()、readline()方法對應,是將字元串寫入到文件中。
writelines()方法和readlines()方法對應,也是針對 列表 的操作。它接收一個 字元串列表 作為參數,將他們寫入到文件中。
特別注意:
換行符不會自動的加入,需要顯式的加入換行符。
f = open('test.txt', 'w')
f.writelines(["111\n", "222\n", "333\n"])
補充說明:
1)對於非默認編碼(utf-8)的文件,需要open時添加encording參數,選擇對應的編碼方式
2)r+, w+, a+,可讀可寫
3)seek()方法,移動文件指針
seek(offset[, whence]) ,offset是相對於某個位置的偏移量。位置由whence決定,默認whence=0,從開頭起;whence=1,從當前位置算起;whence=2相對於文件末尾移動,通常offset取負值。
Ⅹ Python 讀寫文件的編碼與解碼問題
演示文件為docx文檔,內容如下:
運行源碼查看報錯信息
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 15: illegal multibyte sequence
上述錯誤是一種很常見的解碼錯誤,下面介紹該錯誤的解決方法
把utf-8,gbk等各種編碼方式都試了一遍,還是沒有解決問題然後仔細看報錯信息,根據UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfb in position 14: invalid start byte,猜測文件中某個位元組不能解碼,打開文件一看,並沒有看出什麼問題來
open() 函數的第三個參數不是用來野唯接收編碼方式的,而磨脊信是傳入一個buffering的值,此處傳入了'gbk'字元串,所以系統提示傳一個瞎輪整型
通過調用office的API進行操作,因為在office上能完成的操作,都能通過win32完成,所以我們選擇使用win32
(Python3.5 需要安裝 win32compat,裡面含了 win32 的很多包)