我正在尝试读取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
我想要的是读取行的元组,而不是字符串,而是像后面的每个项目一样操作元组。 有可能吗?
答案 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
的每个项目,但尝试将每个项目转换为str
。 tuple
被转换,选择其他格式可以避免这种情况。
New York,"(30, 40)"
解释了之后评估它的必要性。
第二个写入行写入3个元素(现为3列),但保留数据(int
部分除外,无论如何都转换为str
)
New York,30,40
在这种情况下,对行进行整数转换的简单字符串就可以完成工作。
请注意,csv
不是序列化混合数据的最佳方式。最好使用json
。