python读文件和写文件-python开发--从文件中读取数据和写入文件
#! /usr/bin/env python
-*- coding:utf-8 -*-
"""
@Author:gcan
@Email:1528667112@qq.com
@Site:http://www.gcan.top
@File:file.py
@Software:PyCharm
@Date:2018-05-13 23:51:08
@Version:1.0.0
"""
從文件中讀取數據
文本文件可存儲的數據量多得難以置信:天氣數據、交通數據、社會經濟數據、文學作品等。每當需要分析或修改存儲在文件中的信息時,讀取文件都很有用,對數據分析應用
程序來說尤其如此。例如,你可以編寫一個這樣的程序:讀取一個文本文件的內容,重新設置這些數據的格式并將其寫入文件,讓瀏覽器能夠顯示這些內容。 要使用文本文件中的信息,首先需要將信息讀取到內存中。
為此,你可以一次性讀取文件的全部內容,也可以以每次一行的方式逐步讀取。
讀取整個文件 要讀取文件,需要一個包含幾行文本的文件。
下面首先來創建一個文件,它包含精確到小數點后30位的圓周率值,且在小數點后每10位處都換行:
with open("pi_digits.txt") as file_object:
contents = file_object.read()
print(contents)
在這個程序中,第1行代碼做了大量的工作。我們先來看看函數open() 。要以任何方式使用文件——哪怕僅僅是打印其內容,都得先打開 文件,這樣才能訪問它。函數open() 接受一個參數:要打開的文件的名稱。Python在當前執行的文件所在的目錄中查找指定的文件。在這個示例中,當前運行的是file_reader.py,因此Python在file_reader.py所在的目錄中 查找pi_digits.txt。函數open() 返回一個表示文件的對象。在這里,open("pi_digits.txt") 返回一個表示文件pi_digits.txt 的對象;Python將這個對象存儲在我們將 在后面使用的變量中。
關鍵字with 在不再需要訪問文件后將其關閉。在這個程序中,注意到我們調用了open() ,但沒有調用close() ;你也可以調用open() 和close() 來打開和關閉文件,但 這樣做時,如果程序存在bug,導致close() 語句未執行,文件將不會關閉。這看似微不足道,但未妥善地關閉文件可能會導致數據丟失或受損。如果在程序中過早地調 用close() ,你會發現需要使用文件時它已關閉 (無法訪問),這會導致更多的錯誤。并非在任何情況下都能輕松確定關閉文件的恰當時機,但通過使用前面所示的結構,可 讓Python去確定:你只管打開文件,并在需要時使用它,Python自會在合適的時候自動將其關閉。
有了表示pi_digits.txt的文件對象后,我們使用方法read() (前述程序的第2行)讀取這個文件的全部內容,并將其作為一個長長的字符串存儲在變量contents 中。這樣,通過 打印contents 的值,就可將這個文本文件的全部內容顯示出來:
相比于原始文件,該輸出唯一不同的地方是末尾多了一個空行。為何會多出這個空行呢?因為read() 到達文件末尾時返回一個空字符串,而將這個空字符串顯示出來時就是一 個空行。要刪除多出來的空行,可在print 語句中使用rstrip() :
逐行讀取
讀取文件時,常常需要檢查其中的每一行:你可能要在文件中查找特定的信息,或者要以某種方式修改文件中的文本。例如,你可能要遍歷一個包含天氣數據的文件,并使用天 氣描述中包含字樣sunny的行。在新聞報道中,你可能會查找包含標簽 的行,并按特定的格式設置它。
要以每次一行的方式檢查文件,可對文件對象使用for 循環:
filename = "pi_digits.txt"
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
我們將要讀取的文件的名稱存儲在變量filename 中,這是使用文件時一種常見的做法。
由于變量filename 表示的并非實際文件——它只是一個讓Python知道到哪里 去查找文件的字符串,
因此可輕松地將"pi_digits.txt" 替換為你要使用的另一個文件的名稱。調用open() 后,將一個表示文件及其內容的對象存儲到了變量file_object中。
這里也使用了關鍵字with ,讓Python負責妥善地打開和關閉文件。
為查看文件的內容,我們通過對文件對象執行循環來遍歷文件中的每一行
創建一個包含文件各行內容的列表
使用關鍵字with 時,open() 返回的文件對象只在with 代碼塊內可用。如果要在with 代碼塊外訪問文件的內容,可在with 代碼塊內將文件的各行存儲在一個列表中,并
在with 代碼塊外使用該列表:你可以立即處理文件的各個部分,也可推遲到程序后面再處理。 下面的示例在with 代碼塊中將文件pi_digits.txt的各行存儲在一個列表中,再在with 代碼塊外打印它們:
filename = "pi_digits.txt"
with open(filename) as file_object:
lines = file_object.readlines()
print(lines)
for line in lines:
print(line.rstrip())
方法readlines() 從文件中讀取每一行,并將其存儲在一個列表中;接下來,該列表被存儲到變量lines 中;在with 代碼塊外,我們依然可以使用這個變量。
我們使用一個簡單的for 循環來打印lines 中的各行。由于列表lines 的每個元素都對應于文件中的一行,因此輸出與文件內容完全一致。
使用文件的內容
將文件讀取到內存中后,就可以以任何方式使用這些數據了。下面以簡單的方式使用圓周率的值。首先,我們將創建一個字符串,它包含文件中存儲的所有數字,且沒有任何空格:
filename = "pi_digits.txt"
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ""
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
就像前一個示例一樣,我們首先打開文件,并將其中的所有行都存儲在一個列表中。我們創建了一個變量——pi_string ,用于存儲圓周率的值。
接下來,我們使用 一個循環將各行都加入pi_string ,并刪除每行末尾的換行符。我們打印這個字符串及其長度:
在變量pi_string 存儲的字符串中,包含原來位于每行左邊的空格,為刪除這些空格,可使用strip() 而不是rstrip() :
filename = "pi_digits.txt"
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ""
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
這樣,我們就獲得了一個這樣的字符串:它包含精確到30位小數的圓周率值。這個字符串長32字符,因為它還包含整數部分的3和小數點:
3.141592653589793238462643383279
32
讀取文本文件時,Python將其中的所有文本都解讀為字符串。如果你讀取的是數字,并要將其作為數值使用,就必須使用函數int() 將其轉換為整數,或使用 函數float() 將其轉換為浮點數。
包含一百萬位的大型文件
前面我們分析的都是一個只有三行的文本文件,但這些代碼示例也可處理大得多的文件。
如果我們有一個文本文件,其中包含精確到小數點后1 000 000位而不是30位的圓周率值,也可創建一個包含所有這些數字的字符串。
為此,我們無需對前面的程序做任何修改,只需將這個文件傳遞給它即可。在這里,我們只打印到小數點后50位,以免終端為顯 示全部1 000 000位而不斷地翻滾:
filename = "pi_million_digits.txt"
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ""
for line in lines:
pi_string += line.strip()
print(pi_string[:52] + "...")
print(pi_string[:] + "...")
print(len(pi_string))
輸出表明,我們創建的字符串確實包含精確到小數點后1 000 000位的圓周率值:
3.14159265358979323846264338327950288419716939937510...
1000002
對于你可處理的數據量,Python沒有任何限制;只要系統的內存足夠多,你想處理多少數據都可以。
圓周率值中包含你的生日嗎
我一直想知道自己的生日是否包含在圓周率值中。下面來擴展剛才編寫的程序,以確定某個人的生日是否包含在圓周率值的前1 000 000位中。為此,可將生日表示為一個由數字
組成的字符串,再檢查這個字符串是否包含在pi_string 中:
filename = "pi_million_digits.txt"
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ""
for line in lines:
pi_string += line.rstrip()
birthday = input("Enter your birthday, in the form mmddyy: ")
if birthday in pi_string:
print("Your birthday appears in the first million digits of pi!")
else:
print("Your birthday does not appear in the first million digits of pi.")
寫入文件
保存數據的最簡單的方式之一是將其寫入到文件中。通過將輸出寫入文件,即便關閉包含程序輸出的終端窗口,這些輸出也依然存在:你可以在程序結束運行后查看這些輸出, 可與別人分享輸出文件,還可編寫程序來將這些輸出讀取到內存中并進行處理。
寫入空文件
要將文本寫入文件,你在調用open() 時需要提供另一個實參,告訴Python你要寫入打開的文件。為明白其中的工作原理,我們來將一條簡單的消息存儲到文件中,而不是將其打印到屏幕上:
filename = "programming.txt"
with open(filename, "w") as file_object:
file_object.write("I love programming.")
調用open() 時提供了兩個實參。第一個實參也是要打開的文件的名稱;第二個實參("w" )告訴Python,我們要以寫入模式 打開這個文件。打開文件時,
可指定讀取模式 ("r" )、寫入模式 ("w" )、附加模式 ("a" )或讓你能夠讀取和寫入文件的模式("r+" )。如果你省略了模式實參,Python將以默認的只讀模式打開文件。
如果你要寫入的文件不存在,函數open() 將自動創建它。然而,以寫入("w" )模式打開文件時千萬要小心,因為如果指定的文件已經存在,Python將在返回文件對象前清空該文件。
我們使用文件對象的方法write() 將一個字符串寫入文件。這個程序沒有終端輸出,但如果你打開文件programming.txt,將看到其中包含如下一行內容:
I love programming.
比于你的計算機中的其他文件,這個文件沒有什么不同。你可以打開它、在其中輸入新文本、復制其內容、將內容粘貼到其中等。 注意 Python只能將字符串寫入文本文件。要將數值數據存儲到文本文件中,必須先使用函數str() 將其轉換為字符串格式。
寫入多行
函數write() 不會在你寫入的文本末尾添加換行符,因此如果你寫入多行時沒有指定換行符,文件看起來可能不是你希望的那樣:
filename = "programming.txt"
with open(filename, "w") as file_object:
file_object.write("I love programming.")
file_object.write("I love creating new games.")
要讓每個字符串都單獨占一行,需要在write()
語句中包含換行符:
file_object.write("I love programming. ")
file_object.write("I love creating new games. ")
附加到文件
如果你要給文件添加內容,而不是覆蓋原有的內容,可以附加模式 打開文件。你以附加模式打開文件時,Python不會在返回文件對象前清空文件,而你寫入到文件的行都將添加 到文件末尾。如果指定的文件不存在,Python將為你創建一個空文件。
下面來修改write_message.py,在既有文件programming.txt中再添加一些你酷愛編程的原因:
filename = "programming.txt"
with open(filename, "a") as file_object:
file_object.write("I also love finding meaning in large datasets. ")
file_object.write("I love creating apps that can run in a browser. ")
我們打開文件時指定了實參"a" ,以便將內容附加到文件末尾,而不是覆蓋文件原來的內容。我們又寫入了兩行,它們被添加到文件programming.txt末尾:
I love programming.
I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.
最終的結果是,文件原來的內容還在,它們后面是我們剛添加的內容。
總結
以上是生活随笔為你收集整理的python读文件和写文件-python开发--从文件中读取数据和写入文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: erp二次开发有出路吗_ERP的真正技术
- 下一篇: linux 串口编程_ARM-Linux