2017-10-28 100 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模块为您的操作系统规范化一个文件路径

相关问题