Python读取CSV文件并转换为字符串

4

我有一个包含以下值的CSV文件:

ID, Value
1, a
2, b
3, c

我该如何使用Python将此csv转换为以下字符串
[('ID', 'Value'), (1, 'a'), (2, 'b'), (3, 'c')]

我正在尝试以下代码。
with open('sample.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=' ', quotechar='|')
    for row in reader:
        data = ', '.join(row)
        rows.append(data)
print rows

我只能得到以下输出
["'ID','Value'", "1,'a'", "2,'b'", "3,'c'"]

2
[('ID', 'Value'), (1, 'a'), (2, 'b'), (3, 'c')] 不是字符串,而是元组列表。第一个元组包含2个字符串,其他元组包含一个整数和一个字符串。所以你想要那个列表,还是你真的想要该列表的字符串表示形式? - PM 2Ring
我只想读取包含两列的csv文件,就像问题中所述,然后需要将其转换为上述格式(无论是字符串、列表还是元组)。我不擅长Python。因此将上述表示称为字符串。 - V-T
是的,这有效。 - V-T
2个回答

1
不要使用rb,而是使用r来阅读:
with open('sample.csv', 'r') as csvfile:
    csvtext = csvfile.readlines()

mylist = []
for line in csvtext:
    mylist.append(tuple(line.strip().split(', ')))
print(mylist)

OP没有问题,因为他可能在运行Python 2(在Python 3中它会立即崩溃)。但你是对的(这并没有回答问题)。 - Jean-François Fabre
但是我得到的输出是[('ID,Value',), ('1,a',), ('2,b',), ('3,c',)],而我需要的是[('ID', 'Value'), (1, 'a'), (2, 'b'), (3, 'c')]。 - V-T
这意味着,对于字符需要使用单引号,而对于数字则不需要引号。或者对于所有值都使用单引号也可以。 - V-T
从我的解决方案中,您将获得:[('ID', 'Value'), ('1', 'a'), ('2', 'b'), ('3', 'c')],其中所有值都有单引号,正如您所要求的那样... - mrCarnivore
@mrCarnivore 不,我得到的就是这样的 [('ID,Value',), ('1,a',), ('2,b',), ('3,c',)] - V-T
@PraveenVT:这毫无意义。split(',')将str在逗号处分割,并留下两个字符串。我已经测试过了。你是否确实只使用了我的代码,并且文件与你在问题中提到的完全一致? - mrCarnivore

1
为了从CSV数据中生成列表 [('ID','Value'),(1,'a'),(2,'b'),(3,'c')] ,您需要将数字字符串转换为整数。以下是在Python 2中执行此操作的一种方法。
import csv

data = []
with open('sample.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, skipinitialspace=True)
    data.append(tuple(next(reader)))
    for num, val in reader:
        data.append((int(num), val))

print data

output

[('ID', 'Value'), (1, 'a'), (2, 'b'), (3, 'c')]

csv.reader函数将CSV数据的每一行作为一个列表生成。我们需要从该列表中提取项目并将第一个转换为int。然后,我们可以将两个项目打包成元组并将其附加到data列表中。但是,标题行包含两个字符串,因此我们不希望在标题行上执行该转换。
data.append(tuple(next(reader)))

获取头部行并将其转换为元组,然后将结果附加到我们的data列表中。


请注意,Python 2的csv模块需要在'rb'模式下打开文件,但在Python 3中,您需要在'r'模式下打开文件。有关详细信息,请参阅相应的模块文档。除此之外,在Python 3上运行上述代码只需要使用print函数而不是print语句,无需进行其他更改。


如果CSV文件有更多的列,那么有没有通用的方法来处理呢? - V-T
@PraveenVT 当然可以,但最好的方法取决于其他列中的数据类型,例如,如果有需要转换为'int'或'float' 的数字。另一方面,如果您只想读取CSV数据并将其作为不同文件格式写回,则没有必要执行该转换。我建议您在新问题中添加一个包含更多列的输入数据的简短示例,并清楚地显示所需的输出格式。 - PM 2Ring
好的,让我创建一个样本,但是与真实数据类似。 - V-T
在我的新问题中添加了一个简短的示例 https://stackoverflow.com/questions/47672157/parse-csv-to-create-xpt-file-using-python - V-T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接