本文目錄一覽:
Python如何從文件讀取數據
1.1 讀取整個文件
要讀取文件,需要一個包含幾行文本的文件(文件PI_DESC.txt與file_reader.py在同一目錄下)
PI_DESC.txt
3.1415926535
8979323846
2643383279
5028841971
file_reader.py
with open(“PI_DESC.txt”) as file_object:
contents = file_object.read()
print(contents)
我們可以看出,讀取文件時,並沒有使用colse()方法,那麼未妥善的關閉文件,會不會導致文件收到損壞呢?在這裡是不會的,因為我們在open()方法前邊引入了關鍵字with,該關鍵字的作用是:在不需要訪問文件後將其關閉
1.2文件路徑
程序在讀取文本文件的時候,如果不給定路徑,那麼它會先在當前目錄下進行檢索,有時候我們需要讀取其他文件夾中的路徑,例如:
現在文件PI_DESC.txt存儲在python目錄的子文件夾txt中
那麼我們讀取文本內容的代碼得修改為:
with open(“txt\PI_DESC.txt”) as file_object:
contents = file_object.read()
print(contents)
給open參數傳遞的參數得給相對路徑
在Windows中,使用反斜杠(\),但是由於python中,反斜杠被視為轉義字符,在Windows最好在路徑開頭的單(雙)引號前加上r
相對路徑:即相對於程序文件的路徑
絕對路徑:即文本在硬盤上存儲的路徑
使用絕對路徑的程序怎麼寫呢 ?
with open(r”D:\python\txt\PI_DESC.txt”) as file_object:
contents = file_object.read()
print(contents)
1.3逐行讀取
讀取文件時,可能需要讀取文件中的每一行,要以每一行的方式來檢查文件或者修改文件,那麼可以對文件對象使用for循環
file_path = ‘txt\PI_DESC.txt’with open(file_path) as file_object:
for line in file_object:
print(line)
程序運行結果如下:
通過運行結果我們可以看出,打印結果中間有很多空白行,這些空白行是怎麼來的呢?因為在這個文件中,每行的末尾都有一個看不見的換行符,而print語句也會加一個換行符,因此每行末尾就有2個換行符:一個來自文件,另外一個來自print,消除這些換行符,只需要使用方法rstrip()
file_path = ‘txt\PI_DESC.txt’with open(file_path) as file_object:
for line in file_object:
print(line.rstrip())
打印結果
通過運行結果我們可以看出,打印結果中間有很多空白行,這些空白行是怎麼來的呢?因為在這個文件中,每行的末尾都有一個看不見的換行符,而print語句也會加一個換行符,因此每行末尾就有2個換行符:一個來自文件,另外一個來自print,消除這些換行符,只需要使用方法rstrip()
file_path = ‘txt\PI_DESC.txt’with open(file_path) as file_object:
for line in file_object:
print(line.rstrip())
打印結果
1.4創建一個包含文件各行內容的列表
使用關鍵字with時,open()返回的文件對象只能在with代碼塊可用,如果要在with代碼塊外訪問文件的內容,可在with塊中將文件各行存儲在一個列表,並在with代碼塊外使用該列表
file_path = ‘txt\PI_DESC.txt’with open(file_path) as file_object:
lines = file_object.readlines()for line in lines:
print(line.rstrip())
1.5使用文件的內容
在上面一節中我們提到把數據提取到內存中,那麼我們就可以對數據進行隨心所欲的操作了
需要:將圓周率連在一起打印出來(刪除空格),並打印其長度
file_path = ‘txt\PI_DESC.txt’with open(file_path) as file_object:
lines = file_object.readlines()pi_str = ”for line in lines:
pi_str += line.strip()print(pi_str.rstrip())print(len(pi_str.rstrip()))
file_path = ‘txt\PI_DESC.txt’with open(file_path) as file_object:
lines = file_object.readlines()pi_str = ”for line in lines:
pi_str += line.strip()print(pi_str.rstrip())print(len(pi_str.rstrip()))
注意最後print語句並沒有縮進,如果是縮進的話就會每取一行打印一次
打印效果如下
python 讀取文件
#!/usr/bin/python2.7
import random,re
f0=file(‘proxys.txt’,’r’)
dat0=f0.readlines()
f0.close()
#提取含有$1sec的行(我理解你想按sec的大小排序。)
dat1=[]
for i in dat0:
dat1.append((i,re.search(r’\$(\d+)sec’,i).group(1)))
#現在dat1裡面的數據是在原來的每一行前面加了一列sec的值。
dat2=[]
for i in dat1:
if i[0]==1:
dat2.append(i[1])
#現在取出了所有sec==1的行,隨機取一行
dat3=random.choice(dat2)
c1=re.search(r'((\d{1,3}\.?){4}):(\d+)’,dat3).group(1)
c2=re.search(r'((\d{1,3}\.?){4}):(\d+)’,dat3).group(3)
python 讀取大文件數據怎麼快速讀取
python中讀取數據的時候有幾種方法,無非是read,readline,readlings和xreadlines幾種方法,在幾種方法中,read和xreadlines可以作為迭代器使用,從而在讀取大數據的時候比較有效果.
在測試中,先創建一個大文件,大概1GB左右,使用的程序如下:
[python] view plaincopyprint?
import os.path
import time
while os.path.getsize(‘messages’) 1000000000:
f = open(‘messages’,’a’)
f.write(‘this is a file/n’)
f.close()
print ‘file create complted’
在這裡使用循環判斷文件的大小,如果大小在1GB左右,那麼結束創建文件。–需要花費好幾分鐘的時間。
測試代碼如下:
[python] view plaincopyprint?
#22s
start_time = time.time()
f = open(‘messages’,’r’)
for i in f:
end_time = time.time()
print end_time – start_time
break
f.close()
#22s
start_time = time.time()
f = open(‘messages’,’r’)
for i in f.xreadlines():
end_time = time.time()
print end_time – start_time
break
f.close()
start_time = time.time()
f = open(‘messages’,’r’)
k= f.readlines()
f.close()
end_time = time.time()
print end_time – start_time
使用迭代器的時候,兩者的時間是差不多的,內存消耗也不是很多,使用的時間大概在22秒作用
在使用完全讀取文件的時候,使用的時間在40s,並且內存消耗相當嚴重,大概使用了1G的內存。。
其實,在使用跌倒器的時候,如果進行連續操作,進行print或者其他的操作,內存消耗還是不可避免的,但是內存在那個時候是可以釋放的,從而使用迭代器可以節省內存,主要是可以釋放。
而在使用直接讀取所有數據的時候,數據會保留在內存中,是無法釋放這個內存的,從而內存卡死也是有可能的。
在使用的時候,最好是直接使用for i in f的方式來使用,在讀取的時候,f本身就是一個迭代器,其實也就是f.read方法
原創文章,作者:R78TV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130512.html