【问题标题】:How to read a txt file as list of lists in and access it easily in Python?如何读取 txt 文件作为列表列表并在 Python 中轻松访问它?
【发布时间】:2015-07-13 16:53:53
【问题描述】:

我有一个这样的 txt 文件:

1 13
#abor# #e#tun###agy#szel#2# #o##h#d#g ##rkasn#o#oka# #a#tunk e####a#akn##$#$#$##$$$$$$####
1 19
ta###t##ertunk ##gy #zel#####ok hide##f#r##sn#omo#at ##ttu## e#y patak#al$#$$$$$###$$$$$$$
6 19
0/# a #a#akon##uli ##mb## ##l#kok jatszo#####del ####l$$$#$$$$$#$#$#$#$$###$##$$##$$$$#$$$
5 17
a pat#k#a###ar##sok #em#j#l#nt##ztek nyomok volt#k$$$$#$$$#$$$#$#$##$$$$###$####$$#$$$$#$#

但连续几十行。

我想读取这个 txt 文件并将其存储在列表列表中,以便我可以轻松访问每个字符,例如 list_name[x][y] 检查它是否是 # 等。

最好的方法是什么?

【问题讨论】:

    标签: python list text io


    【解决方案1】:

    为确保文件在您阅读后关闭,请使用with open()。此方法为您提供可以根据您的要求访问的字符列表。你可以 使用:

    with open('file.txt', 'r') as f_in:
        my_list = [line for line in f_in]
    
    # do something with my_list
    

    ['1 13\n', '#abor# #e#tun###agy#szel#2# #o##h#d#g ##rkasn#o#oka# #a#tunk e####a#akn##$#$#$##$$$$$$####\n', '1 19\n', 'ta###t##ertunk ##gy #zel#####ok hide##f#r##sn#omo#at ##ttu## e#y patak#al$#$$$$$###$$$$$$$\n', ...]

    调用my_list[1][0] 然后返回# - 第二行的第一个字符。

    这会在每行的末尾留下行尾字符,您可以使用 my_list = [line.strip() for line in f_in] 删除它

    【讨论】:

    • 你得到了我对上下文管理器的支持。但是,作者可能不希望去除空格。
    • 编辑删除了空白。
    • 如果不是所提供解决方案的第一个变体,您的答案将是我的首选。它不符合 OP 的规范:“(...) 以便我可以轻松访问每个 字符,例如 list_name[x][y]”。请考虑删除此变体或进行更改,以便它创建字符列表而不是单词列表。
    【解决方案2】:

    试试:

    list_name = [list(line) for line in open('myfile.txt')]
    

    那么list_name[n] 将是来自nth 行的字符列表。

    但是,请注意,正如其他回答者指出的那样,字符串共享用于获取值的列表语法(对于字符串s,您可以使用s[n] 来获取nth 元素)。列表和字符串的切片略有不同:对于字符串s = 'abcd's[1:3]'bc',但对于s = ['a', 'b', 'c', 'd']s[1:3]['b', 'c']。因此,其他答案可能更适合您的目的,具体取决于您想要实现的具体目标。

    【讨论】:

    • 这在技术上是正确的,但如果您没有将字符串转换为列表,您仍然可以将[n] 与字符串一起使用。
    • 当然。但是@magnarch 询问了列表列表。他没有写太多关于目的,所以我按字面意思处理请求(例如,在我的版本中,您可以修改单个字符,而在以str 表示行的版本中,您必须创建一个全新的字符串) .
    • 好点!可能值得向 OP 解释它可以作为字符串索引,以防他们只是不知道而不是要求这种行为。
    【解决方案3】:

    乍一看,我会使用列表理解来做到这一点:

    >>> matrix = open('myfile.txt').read()
    >>> matrix = [item.split() for item in matrix.split('\n')[:-1]]
    

    您也可以很容易地将它放入一个函数中,以获取文件名并返回矩阵。

    【讨论】:

      【解决方案4】:

      您不必将字符串强制转换为列表即可将字符寻址为line[index]。 您唯一需要做的就是读取文件并运行检查功能。

      def check_the_line(line):
          assert line[5] == "#"
      
      with open('file.txt', 'r') as f_in:
         for line in f_in:
            check_the_line(line)
      

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        相关资源
        最近更新 更多