我正在处理包含多个列的制表符分隔文件。每列包含超过3000条记录。
Column1 Column2 Column3 Column4
1000041 11657 GenNorm albumin
1000043 24249 GenNorm CaBP
1000043 29177 GenNorm calcium-binding protein
1000045 2006 GenNorm tropoelastin
问题:使用Python,如何读取制表符分隔文件并将每个列(及其记录)存储在单个变量中。使用“print”打印出特定的列
初步代码:到目前为止,我使用此代码来读取tsv文件
import csv
Dictionary1 = {}
with open("sample.txt", 'r') as samplefile:
reader = csv.reader(samplefile, delimiter="\t")
答案 0 :(得分:1)
我认为你只是在问如何转换"从一系列行到一系列列的CSV文件。
在Python中,您始终可以使用zip
函数转置任何可迭代的迭代:
with open("sample1.txt") as samplefile:
reader = csv.reader(samplefile, delimiter="\t")
columns = zip(*reader)
现在,如果要按顺序打印每列:
for column in columns:
print(column)
这里,columns
是元组的迭代器。如果您想要其他格式,例如将列名称映射到值列表的dict,您可以轻松地对其进行转换。例如:
columns = {column[0]: list(column[1:]) for column in columns}
或者,如果你想把它们放在四个单独的变量中,你可以使用普通的元组解包:
col1, col2, col3, col4 = columns
但这似乎并不是一个很好的理由。
答案 1 :(得分:-1)
不确定python中的代码但使用此循环。将所有内容存储到字典中然后使用此循环然后使用该函数调用索引以打印方法,您可以修改函数以适应您想要的密钥,您可以通过单词搜索等
int mainCounter = 0;
int counter1 = 0;
string arrColumn1[3000];
int counter2 = 0;
string arrColumn1[3000];
int counter3 = 0;
string arrColumn1[3000];
int counter4 = 0;
string arrColumn1[3000];
for(int i = 0; i<dictionary.length; ++i){
switch ( mainCounterounter )
{
case 0:
arrColumn1[counter1] = dictionary[i];
++counter1;
++mainCounter;
break;
case 1:
arrColumn2[counter2] = dictionary[i];
++counter2;
++mainCounter;
break;
case 2:
arrColumn3[counter3] = dictionary[i];
++counter3;
++mainCounter;
break;
case 3:
arrColumn4[counter4] = dictionary[i];
++counter4;
mainCounter = 0;
break;
}
}
void printRecordFunction(int colToSearch, string findThis, string arr1[], string arr2[], string arr3[], string arr4[]){
int foundIndex=0;
if(colToSearch == 1){
for(int i = 0; i<arr1.length; ++i){
if(strcmp(arr1[i], findthis)==0){
foundIndex = i;
break;
}
}
}else if(colToSearch == 2){
for(int i = 0; i<arr2.length; ++i){
if(strcmp(arr2[i], findthis)==0){
foundIndex = i;
break;
}
}
}else if(colToSearch == 3){
for(int i = 0; i<arr3.length; ++i){
if(strcmp(arr3[i], findthis)==0){
foundIndex = i;
break;
}
}
}else if(colToSearch == 4){
for(int i = 0; i<arr4.length; ++i){
if(strcmp(arr4[i], findthis)==0){
foundIndex = i;
break;
}
}
}
count<<"Record: " << arr1[i] << " " << arr2[i] << " " << arr3[i] << " " << arr4[i] << endl;
}
对不起,这是非常难的代码,但我希望它能给你一些想法,你可以调整它