Python 2-将制表符分隔的文本文件数据解析到列表中
请帮助我解决我对列表和csv的基本误解 我有一个由制表符分隔的数据组成的文本文件(这就是我使用csv的原因)。它有一个包含4个标题的标题行,然后是40行数据。我正在尝试创建一个程序,搜索文本文件的内容,找到匹配项后,将打印该行数据 我的第一步是从文本文件创建一个列表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
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如果有帮助,我已经编辑了原始文章。我还没有听说过像熊猫这样的图书馆,我现在就去查,谢谢!