2017-10-28 120 views
-3

我有一個很大的txt文件。每行看起來像這樣:將大文本文件導入Python並創建列表清單

1. 27.01.1957 8,12,31,39,43,45 
2. 03.02.1957 5,10,11,22,25,27 
3. 10.02.1957 18,19,20,26,45,49 
4. 17.02.1957 2,11,14,37,40,45 
5. 24.02.1957 8,10,15,35,39,49 
6. 03.03.1957 24,26,31,35,43,47 
7. 10.03.1957 13,20,23,29,38,44 

我想創建一個列表,每個列表中哪一行。
我該怎麼做?

+2

list的列表需要什麼形式?每行三個元素?更多?減?您提供的輸入可以有效地產生許多不同的輸出。 – ShadowRanger

回答

0

要獲得列出的名單,其中每個子列表是從字面上表示每個文件的行,你可以做這樣的字符串:

data = []; 
with open("big_file.txt", 'r') as f: 
    for line in f: 
     data.append([line.strip()]) 

這裏的程序由線讀取文件線和追加每行該文件作爲列表data的子列表。

另外,如果你想擁有的子表作爲一個單獨的元素之間用空格分開元素,在追加行,而不是使用split()

data.append(line.split()) 

將由空間拆分組件 - 刪除多餘的[]也是split()無論如何都會返回子列表。

+1

'.strip()。split()'是多餘的; '.split()'(不帶參數)已經忽略了前導和尾隨空格。 – ShadowRanger

1

如果文件是真正,您可能需要使用一臺發電機,以保持內存使用情況下來:

def read_lines_from_big_file(path): 
    with open(path) as fp: 
     for line in fp: 
      parts = line.split() 
      yield parts # -> ['1.', '27.01.1957', '8,12,31,39,43,45'] 

for split_line in read_lines_from_big_file(path): 
    # do something with split_line 
-2

學會讓你的生活更容易,不使用with open。相反,learn to use真棒pathlib package

使用pathlib.Path.read_text()方法,您可以將文件加載到字符串列表,每一個都是一個行:

import pathlib 

text = pathlib.Path('myfile.txt').read_text() 

爲了讓這個變成爲行列表,使用split方法,分裂在每個換行符處:

lines = text.split('\n') 

幾乎在那裏。現在你想製作你的清單清單。我假設你希望每個子列表都由空格和逗號之間的東西組成。考慮到這一點,構建你的名單列表如下:

listoflists = [] 
for line in lines: 
    listoflists.append(line.replace(',', ' ').split()) 

最後,做這一切一氣呵成如下:

listoflists = [line.replace(",", " ").split() for line in pathlib.Path('myfile.txt').read_text().split("\n")] 
+1

這似乎並不比使用'with'給我更容易。另外,它一次讀取整個文件,如果文件非常大,可能不適合。 – 2017-10-28 20:01:05

+0

@Wyatt在這種情況下無關緊要。無論如何,整個文件將被讀入內存。不妨馬上做。我的要點是將'pathlib'傳播給一位新用戶,因爲它比處理文本和文件的其他任何方式都要好得多。 –

+1

通過使用生成器可以避免讀取整個文件。我同意,對於簡單的情況(和相對少量的數據)'Path.read_text()'可能更容易,但不是在任何情況下。 – 2017-10-28 20:09:35

0

您可以定義自己的分隔符的分裂你的字符串(或文件行)與模塊rehttps://docs.python.org/3/library/re.html。使用with open()表示在代碼中的with open()縮進結束後文件鏈接關閉。

我用list comprehension這裏,因爲它比一個for循環略快於構造列表

import re 

def return_lines_split_by_choice(delimiters,path): 
    re_pattern = '|'.join(map(re.escape,delimiters)) 
    with open(path) as file_handle: 
     return [re.split(re_pattern,line.rstrip()) for line in file_handle] 

my_list_of_lists = return_lines_split_by_choice((" ",","),my_filepath) 

只要把你的分隔符,或事物的選擇,在這裏(" ",",")

結果是將行拆分:

for sublist in my_list_of_lists: 
    print (sublist) 

['1.', '27.01.1957', '8', '12', '31', '39', '43', '45'] 
['2.', '03.02.1957', '5', '10', '11', '22', '25', '27'] 
['3.', '10.02.1957', '18', '19', '20', '26', '45', '49'] 
['4.', '17.02.1957', '2', '11', '14', '37', '40', '45'] 
['5.', '24.02.1957', '8', '10', '15', '35', '39', '49'] 
['6.', '03.03.1957', '24', '26', '31', '35', '43', '47'] 
['7.', '10.03.1957', '13', '20', '23', '29', '38', '44'] 

如果你只是想行的列表使用這個功能來代替:

def list_of_lines(path): 
    with open(path) as file_handle: 
     return [line.rstrip() for line in file_handle] 

這樣,只要運行它:

my_list_of_lists = list_of_lines(my_filepath) 

如果你的Python程序在同一文件夾中的TXT文件,然後你的文件路徑可以只是像這樣"mytxt.txt"否則你可以使用的文件名os模塊爲您的操作系統規範化一個文件路徑