从Python中的csv中读取元组

时间:2017-10-31 20:27:07

标签: python csv tuples

我正在尝试读取csv中的一行,我之前已经写过了。 阅读时,写入的行看起来像这样:['New York', '(30,40)'] 并且像这样:['New York', '(30,40)'](将字符串转换为字符串)。

我需要从元组中读取每个项目以使用整数来操作,但如果它像字符串一样被读取,我就不能这样做,因为如果我这样做:tuple[0],我得到的是:'(' - 字符串元组的第一个字符 -

也许这是关于我如何编写和读取行的问题,实际上就是这样:

def writeCSV(data,name):
  fileName = name+'.csv'
  with open(fileName, 'a') as csvfile:
     writer = csv.writer(csvfile, delimiter=',')
     writer.writerow(data)

 def readCSV(filename):
    allRows = []
    with open(filename, 'rb') as f:
       reader = csv.reader(f, delimiter=' ')
       for row in reader:
          allRows.append(row)
 return allRows 

我想要的是读取行的元组,而不是字符串,而是像后面的每个项目一样操作元组。 有可能吗?

2 个答案:

答案 0 :(得分:0)

您需要在元组字符串上使用ast.literal_eval()

>>> my_file_line =  ['New York', '(30,40)']
>>> import ast
>>> my_tuple = ast.literal_eval(my_file_line[1])
>>> my_tuple[0]
30

因为当前在索引1处读取文件后获得的列表是保存元组格式的有效字符串。 ast.literal_eval会将您的元组字符串转换为tuple对象,然后您可以根据索引访问元组。

答案 1 :(得分:0)

因为你自己制作文件,为什么不从一开始就把它做好:

import csv

data = ['New York', (30,40)]
with open("out.csv","w",newline="") as f:
    cw=csv.writer(f)
    cw.writerow(data)    # wrong
    cw.writerow(data[:1]+list(data[1]))  # okay

第一行写入data的每个项目,但尝试将每个项目转换为strtuple被转换,选择其他格式可以避免这种情况。

New York,"(30, 40)"

解释了之后评估它的必要性。

第二个写入行写入3个元素(现为3列),但保留数据(int部分除外,无论如何都转换为str

New York,30,40

在这种情况下,对行进行整数转换的简单字符串就可以完成工作。

请注意,csv不是序列化混合数据的最佳方式。最好使用json