【问题标题】:Importing large tab-delimited .txt file into Python将大型制表符分隔的 .txt 文件导入 Python
【发布时间】:2013-06-04 02:06:48
【问题描述】:

我有一个制表符分隔的 .txt 文件,我正在尝试将其导入 Python 中的矩阵数组,其格式与文本文件相同,如下所示:

123088 266 248 244 266 244 277

123425 275 244 241 289 248 231

123540 156 654 189 354 156 987

请注意,上面还有很多很多行(大约 200 行)我想传递给 Python,并在从中创建矩阵数组时保持相同的格式。

我目前的代码是:

d = {}
with open('file name', 'rb') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='\t')
    for row in csv_reader:
        d[row[0]] = row[1:]

它稍微做了我需要它做的事情,但不是我的目标。我想完成我可以输入 print(d[0,3]) 的代码,它会吐出 248。

【问题讨论】:

    标签: python arrays list csv


    【解决方案1】:

    首先,您将其加载到字典中,该字典不会获取您想要的列表列表。

    使用 CSV 模块生成这样的列表非常简单:

    import csv
    with open(path) as f:
        reader = csv.reader(f, delimiter="\t")
        d = list(reader)
    print d[0][2] # 248
    

    这会给你一个字符串列表,所以如果你想得到数字,你必须转换为 int。

    也就是说,如果您有一个大数组(或正在进行任何类型的数值计算),您应该考虑使用类似NumPypandas 的东西。如果你想使用 NumPy,你可以这样做

    import numpy as np
    d = np.loadtxt(path, delimiter="\t")
    print d[0,2] # 248
    

    作为奖励,NumPy 数组允许您进行快速向量/矩阵运算。 (另外,请注意d[0][2] 也适用于 NumPy 数组)。

    【讨论】:

    • 有没有办法让np.loadtxthandle 文件同时包含数字和文本?
    • @CapeCode 那时我会切换到使用熊猫,它会自动处理它。您也可以使用 converters 关键字参数,但最终会得到一个对象 dtype 数组。
    【解决方案2】:

    试试这个:

    d = []
    with open(sourcefile,'rb') as source:
        for line in source:
            fields = line.split('\t')
            d.append(fields)
    

    print d[0][1] 将打印 266。

    print d[0][2](记住您的数组是从 0 开始的)将打印 248。

    以与您的输入相同的格式输出数据:

    for line in d:
        print "\t".join(line)
    

    【讨论】:

    • 谢谢,效果很好!如果我输入 print(d) 虽然我最终得到一个非常串联的列表。我如何让代码返回一个列表,其中定义了顶部的数据等列?
    • 你能发布一个你的结果和期望结果的例子吗? print(d)print d 应该为您提供完整的列表列表。原始文件中的每一行都是一个值列表,每个列表都将添加到 d 中,d 本身就是一个列表
    • 如果您只想以与原始输入相同的格式输出,请参阅我上面的编辑
    【解决方案3】:

    使用 Pandas 库:-

    import pandas as pd
    dataset = pd.read_csv(path,delimiter="\t")
    dataset.iloc[0,2]
    

    【讨论】:

      【解决方案4】:

      不确定如何使print(d[0,3]) 输出248,但这将使print(d[0][3]) 输出248。第一个StackOverflow 答案,所以IDK 如何显示我的代码块中的最后两行实际上只是一个长行。

      import csv
      
      Text_Input = r"<.txt file>"  
      listoflists= []
      
      with open(Text_Input) as txtfile:
          reader = csv.reader(txtfile)
      
          for row in reader:
              listoflists.append([int(row[0].split()[i]) for i in 
              range(len(row[0].split()))])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多