我目前正在Python类中进行一项作业,其中一个特殊部分是要求我导入一个CSV文件(数据格式为“text,number,number,...,number,编号“)不使用CSV模块(或任何模块,实际上),并以这种格式将数据作为元组列表返回:
[(’Text’, [number, number, ..., number, number]),
(’Text’, [number, number, ..., number, number]),
.....]
我想我已经有了打开文件并开始逐行读取的实际过程(请参阅下面的代码段),但我不太清楚如何继续解析每一行到需要的格式。
def load_data(filename):
open(filename)
for line in filename
我已经尝试过寻求帮助,但我似乎找到的唯一帮助就是使用CSV模块(这不是特别有用,因为我们不允许导入数学库中的任何模块)或者数据以不同的格式输入和/或输出。如果有人能给我一些关于我应该做什么或者我可以在哪里开始的指示,这将是非常有帮助的。谢谢!
编辑:根据@dotancohen的建议,这里有一些示例数据:
Slow Loris, 21.72, 29.3, 20.08, 29.98, 29.85, 26.22, 29.68
Ocelot, 57.51, 47.59, 55.89, 47.15, 46.71, 51.7, 46.68, 54.54
Tiger, 75.0, 82.43, 112.11, 89.93, 103.19, 80.6, 113.44, 75.55, 102.29, 108.1, 98.84, 101.48, 77.75, 98.57, 70.31, 78.28, 80.18
以下是我目前的潜在解决方案:
def load_data(filename):
open(filename) as file
output = []
for line in filename
temp_list = line.split(',')
temp_item = temp_list.pop(0)
tup = (temp_item, temp_list)
output.append(tup)
return output
答案 0 :(得分:2)
CSV文件通常使用逗号或制表符分隔行,因此在天真的情况下,这将为您提供不同的字段:
for line in filename:
fields = line.split(',') # For comma-delimited files
# - or -
fields = line.split('\t') # For tab-delimited files
但是,我们很少能让自己变得如此幼稚。 CSV文件具有以下警告:
for line in filename
。因此,要可靠地解析CSV文件,您需要一个状态机,它可以跨文件中的行保存状态。一路上有一些可怕的惊喜,例如在Python 2中处理Unicode CSV文件(提示:如果你有非ASCII文本,请使用Python 3)。还有一些小惊喜,比如一些应用程序在逗号分隔符后面添加空格或者不在行末尾为空白字段添加逗号。
因此,如果您要接受用户输入的CSV文件,请使用CSV模块。但是,如果您可以控制输入(即从另一个脚本生成它),那么您可以使用朴素的line.split('\t')
方法。
根据OP发布的示例数据,我们看到他不必担心引用字段,但他的CSV源实际上是在逗号分隔符后添加了错误的空格。因此,这是OP特定的代码:
for line in filename:
fields = line.split(',')
fields = [x.strip() for x in fields] # Remove whitespace
答案 1 :(得分:1)
要考虑的一个关键概念是split()。
根据逗号分割CSV似乎是这个难题的一个重要部分,不同意。
答案 2 :(得分:0)
这是data
文件中的CSV
:
text1 1 2 3 4 5
text2 6 7 8 9 10
text3 11 12 13 14 15
您可以使用setdefault
和zip
来实现Python2中所需的输出。
d = {}
with open('your_file.csv', 'rb') as f:
for line in f:
line = line.split()
for i in line[1:]:
key = (line[0])
d.setdefault(key, []).append(int(i))
x = sorted(d.keys())
y = sorted(d.values())
lst = zip(x,y)
print (lst)
输出:
[('text1', [1, 2, 3, 4, 5]), ('text2', [6, 7, 8, 9, 10]), ('text3', [11, 12, 13, 14, 15])]
在 Python3 中,您必须将此行lst = zip(x,y)
替换为lst = list(zip(x,y))
答案 3 :(得分:0)
mycsv文件内容:(data.csv)
"New Zealand,46 - 15,Argentina ,01/06/1987,31"
"France,70 - 12,Zimbabwe ,02/06/1987,58"
"Wales,40 - 9,Canada ,03/06/1987,31"
"England,34 - 6,USA ,03/06/1987,28"
"New Zealand,49 - 6,Wales ,14/06/1987,43"
"New Zealand,70 - 6,Italy ,22/05/1987,64"
"Canada,37 - 4,Tonga ,24/05/1987,33"
"New Zealand,74 - 13,FIJI ,27/05/1987,61"
"France,55 - 12,Romania ,28/05/1987,43"
"England,60 - 7,Japan ,30/05/1987,53"
代码以在没有csv模块的情况下读取csv并将每一行存储到列表中:
fo = open("data.csv", 'r')
data = fo.read()
fo.close()
games=[]
data = data.splitlines()
for line in data:
games.append(line.split(","))
print(games)