如何将文本文件转换为数组列表(数组嵌套数组)并移除空格/换行符

4

For example I have a txt file:

3 2 7 4
1 8 9 3
6 5 4 1
1 0 8 7

每行都有4个数字,共有4行。在每行的末尾都有一个\n(除了最后一行)。我拥有的代码是:

f = input("Insert file name: ")
file = open(f, encoding="UTF-8")

我想要的是将文本文件转换成[[3,2,7,4],[1,8,9,3],[6,5,4,1],[1,0,8,7]]
我尝试了所有方法,知道答案可能非常简单,但经过一个小时的尝试后,我真的放弃了。我试过read()readlines()split()splitlines()strip()和其他我在互联网上能找到的方法。很多方法甚至都看不出它们之间的区别...

1
在打开文件时,始终使用with语句。它会自动在块结束时关闭文件对象。此外,您应该考虑使用更适合此情况的csv模块。使用csv读取文件,它将给您一个包含所有行拆分的可迭代对象。然后,list(reader_object)将为您提供所需的结果。 - Mazdak
1
看起来像是重复的问题,但不容易找到一个原始解决方案。这是一个好问题,因为标题已经说得很清楚了,而且正文也足够简短和有文档支持。非常棒的第一篇文章。 - Jean-François Fabre
4个回答

4

打开文件后,可以使用您提到的split函数和嵌套列表推导式来使用这个一行代码:

with open(f, encoding="UTF-8") as file:   # safer way to open the file (and close it automatically on block exit)
    result = [[int(x) for x in l.split()] for l in file]
  • 内部的列表解析将每行拆分并转换为整数(生成整数数组)
  • 外部的列表解析仅迭代文件的行

请注意,如果文件中存在整数以外的内容,它将失败。

(顺便提一下,在Python 2中,file是内置的,但在Python 3中不再是,但我通常会避免使用它)


2
您可以这样做:
[map(int,i.split()) for i in filter(None,open('abc.txt').read().split('\n'))]

逐行执行以获取更多信息

In [75]: print open('abc.txt').read()
3 2 7 4

1 8 9 3

6 5 4 1

1 0 8 7

split 带有换行符。

In [76]: print open('abc.txt').read().split('\n')
['3 2 7 4', '', '1 8 9 3', '', '6 5 4 1', '', '1 0 8 7', '']

删除不必要的空字符串。

In [77]: print filter(None,open('abc.txt').read().split('\n'))
['3 2 7 4', '1 8 9 3', '6 5 4 1', '1 0 8 7']

split 按空格分割

In [78]: print [i.split() for i in filter(None,open('abc.txt').read().split('\n'))]
[['3', '2', '7', '4'], ['1', '8', '9', '3'], ['6', '5', '4', '1'], ['1', '0', '8', '7']]

将该元素转换为int

In [79]: print [map(int,i.split()) for i in filter(None,open('abc.txt').read().split('\n'))]
[[3, 2, 7, 4], [1, 8, 9, 3], [6, 5, 4, 1], [1, 0, 8, 7]]

2
以下使用列表推导式创建一个嵌套列表。它逐行读取文件,使用空格作为分隔符进行拆分,使用map函数创建一个迭代器,该迭代器返回对每个字符串元素调用int整数构造函数的结果,并从中创建一个子列表。

这个过程对于文件中的每一行都会重复执行,每次都会生成最终列表容器对象的一个子列表。

f = input("File name? ")
with open(f, encoding="UTF-8") as file:
    data = [list(map(int, line.split())) for line in file]
print(data)  # -> [[3, 2, 7, 4], [1, 8, 9, 3], [6, 5, 4, 1], [1, 0, 8, 7]]

1
你认为你能否添加更多说明你的代码如何运作的描述到你的回答中? - George Willcox

0
with open('intFile.txt') as f:
    res = [[int(x) for x in line.split()] for line in f]
    with open('intList.txt', 'w') as f:
        f.write(str(res))

补充已接受的答案。如果您想将该列表写入文件,您需要打开文件并将其作为字符串写入,因为write仅接受字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接