Python 2-将制表符分隔的文本文件数据解析到列表中

Python 2-将制表符分隔的文本文件数据解析到列表中,python,list,csv,tab-delimited,Python,List,Csv,Tab Delimited,请帮助我解决我对列表和csv的基本误解 我有一个由制表符分隔的数据组成的文本文件(这就是我使用csv的原因)。它有一个包含4个标题的标题行,然后是40行数据。我正在尝试创建一个程序,搜索文本文件的内容,找到匹配项后,将打印该行数据 我的第一步是从文本文件创建一个列表 import csv list=[] #create a new empty list with open('data.txt','rb') as f: next(f) #skip heading row in text

请帮助我解决我对列表和csv的基本误解

我有一个由制表符分隔的数据组成的文本文件(这就是我使用csv的原因)。它有一个包含4个标题的标题行,然后是40行数据。我正在尝试创建一个程序,搜索文本文件的内容,找到匹配项后,将打印该行数据

我的第一步是从文本文件创建一个列表

import csv

list=[] #create a new empty list
with open('data.txt','rb') as f:
    next(f) #skip heading row in text file (I cannot get csv.Dictreader instead to work as an alternative to this step)
    data = csv.reader(f,delimiter='\t') #read text file with csv
    for row in data:
        list.append(row) #add the data from the text file to the list
当我按原样运行这个程序时,我可以键入
打印列表
,它会打印文本文件的内容,每一行都包含在一个[]中。当我键入
print row
时,它将打印文本文件中的最后一行条目。当我键入
print row[0]
时,它将打印最后一行的第一列,依此类推第[1]行、第[2]行和第[3]行。当我键入
print len(list)
时,它返回'40',这是不包括标题的行数

我无法打印文本文件中的任何其他行。我在创建列表时是否做错了什么?如何访问其他行并检查是否已正确创建列表

我认为接下来的步骤有问题,我想确保第一步是正确的!我已经阅读了我能找到的所有文档和所有模糊相关的堆栈溢出查询,但我似乎并不理解这一点。我真的非常感谢你的帮助

编辑:我被要求解释我想用这个做什么

我有一个文本文件(data.txt)。它在四列下有以制表符分隔的数据行

我想创建一个搜索功能,以便: 用户输入要搜索的列 用户输入一个搜索词 程序搜索列表以查找匹配项 程序然后打印包含匹配数据的整行

例如。 姓名年龄地址工作 马克49曼彻斯特教师 史密斯52萨默塞特银行家酒店 威廉姆斯83肯特学生

要做到这一点,我认为我需要将文本文件制作成一个使用csv解析的列表(因为数据是以制表符分隔的)。然后我想我应该使用
name=row[0]
age=row[1]
等等来完成我的搜索功能


我无法理解列表函数在第[0]行等方面的工作原理。

您为什么要使用
csv
?你只是在分道扬镳

我为自己制作了一个这样的测试文件:

header1 header2 header3 header4
row10   row11   row12   row13
row20   row21   row22   row23
row30   row32   row32   row33
row40   row42   row42   row43
row50   row52   row52   row53
row60   row62   row62   row63
以及访问每个元素的一些简单行:

with open('data.txt','r') as f:    
    lines = f.readlines()[1:]
    for line in lines:
        elements = line.strip().split("\t")
        print elements, len(elements)
结果输出为:

['row10', 'row11', 'row12', 'row13'] 4
['row20', 'row21', 'row22', 'row23'] 4
['row30', 'row32', 'row32', 'row33'] 4
['row40', 'row42', 'row42', 'row43'] 4
['row50', 'row52', 'row52', 'row53'] 4
['row60', 'row62', 'row62', 'row63'] 4

这样,您可以将
元素的每个条目添加到一个新数组(如
列表
)中,并继续使用该数组。

可以有更简单的方法来实现这一点,但是我很乐意在这里使用它。这个程序只是一个草图。您将需要修改以优化它。例如,如果需要搜索列和记录,则需要使用某种“regex”(重新打包)逻辑修改func。如果你需要更多的帮助,请告诉我

我创建了一个.txt文件

        name    state   game
        john    CA      soccer
        peter   CA      soccer
        kate    CA      basketball
        ed      CA      football


    import pandas as pd
    df=pd.read_csv("C:/Amrita/test.txt", header=None,     delim_whitespace=True,names=['name','state','game'])
    def myfunc(data): 
            prompt1 = "Enter column name: \n"
            prompt2 = "Enter search term: \n"
            user_input1 = raw_input(prompt1)
            user_input2 = raw_input(prompt2)
            print df[(df[user_input1] == user_input2)]
    myfunc(df)  

    Enter column name: 
    game
    Enter search term: 
    soccer
    name   state    game
    john    CA      soccer
    peter   CA      soccer

非常感谢您的回复!我想我需要使用csv,因为我想要创建搜索功能:用户选择他们想要搜索的标题,输入搜索词,然后程序找到匹配项并打印整行。这就是我对现在所拥有的感到困惑的地方。输入第[0]行、第[1]行等时返回的数据通过制表符分隔正确分割。但为什么它只是数据的最后一行?因为我认为你的建议——我不仅需要拆分行,还需要区分行中以制表符分隔的数据?我刚刚尝试了你的建议,@dersvenhesse!我想我有一个更精确的问题要问你,没有我所有额外的混乱细节:如果我把
print elements[0]
而不是
print elements,len(elements)
,那么当我运行它时,我的程序会为所有40个条目打印第1列。如果在运行此程序时输入
print elements[0]
它只打印最后一个条目的第1列。“这是为什么?”埃米登:对不起,我想我还是不明白你的问题。当我用
print elements[0]
而不是
print elements
运行程序时,输出是
row10
<代码>第60行
。这就是它应该做的。现在问题在哪里?您是否确保打印时缩进正确?请分享您正试图实现的目标,以及您计划对列表执行的操作。下面的帖子将帮助你阅读你的文件。如果您需要执行其他操作,可以使用功能强大的库,例如Pandas。@Amritasawand如果有帮助,我已经编辑了原始文章。我还没有听说过像熊猫这样的图书馆,我现在就去查,谢谢!