我有一个CSV文件,我想逐个读取这个文件,以便我可以将它写入excel。我正在使用csv.reader并枚举结果,以便我可以将值放入Excel中的相应单元格。
使用当前代码,一旦我枚举值变成字符串。如果我用sheet.write(rowi,coli,value)
写入excel,则所有单元格都被格式化为文本。我不能拥有这个,因为我需要在之后对列进行求和,它们需要被视为数字
例如,我的文本文件将包含:1,a,3,4.0,5,6,7
首次枚举后,第一行:(0,'1,a,3,4.0,5,6,7')
第二次枚举后,第一行的第一列:(0,0,'1')
问题:如何读取此csv文件以产生(0,0,1)(等)?
以下是我正在使用的一些代码:
import csv, xlwt
with open('file.csv', 'rb') as csvfile:
data = csv.reader ((csvfile), delimiter=",")
wbk= xlwt.Workbook()
sheet = wbk.add_sheet("file")
for rowi, row in enumerate(data):
for coli, value in enumerate(row):
sheet.write(rowi,coli,value)
#print(rowi,coli,value) gives (rowi, coli, 'value')
答案 0 :(得分:1)
import csv, xlwt
with open('file.csv', 'rb') as csvfile:
data = csv.reader ((csvfile), delimiter=",")
wbk= xlwt.Workbook()
sheet = wbk.add_sheet("file")
for rowi, row in enumerate(data):
for coli, value in enumerate(row):
sheet.write(rowi,coli,value)
wbk.save("workbook_file")
即使print(rowi,coli,value)显示'value',输出文件中的单元格也应该显示没有引号。
如果您的数据采用1, 2, 3
而非1,2,3
的格式,请在for coli, value in enumerate(row):
行之后加上:
value = value.lstrip(" ")
答案 1 :(得分:1)
我认为python的csv模块仍然缺少一个水晶球...更严重的是,在csv文件中没有指示变量的类型,整数,浮点数,字符串或日期。默认情况下,Reader会转换字符串列表中的行。
如果您希望某些列为整数,则可以向脚本添加一个布尔列表。假设您有4列,第三列是整数
int_col = [ false, false, true, false ]
...
for rowi, row in enumerate(data):
for coli, value in enumerate(row):
val = int(value) if int_col(coli) else value
sheet.write(rowi,coli,val)
您还可以尝试猜测哪些列是整数,读取n行(例如n = 10),并且对于找到n个整数的每个列,您可以将该列视为整数。
或者您甚至可以想象一个2遍操作:第一遍确定列的类型,第二遍执行插入。
答案 2 :(得分:0)
我发现Python的标准库函数在处理CSV文件方面有点缺乏。我希望在可能的情况下使用熊猫。
import xlwt
from pandas.io.parsers import read_csv
df = read_csv('file.csv')
#number the columns sequentially
df.columns = [i for i, e in enumerate(df.columns)]
#unstack the columns to make 2 indices plus a column, make row come before col,
#sort row major order, and then unset the indices to get a DataFrame
newDf = df.unstack().swaplevel(0,1).sort_index().reset_index()
#rename the cols to reflect the types of data
newDf.columns = ['row', 'col', 'value']
#write to excel
newDf.to_excel('output.xls', index=False)
这也会将行号和列号保持为整数值。我拿了一个示例csv文件,row
和col
都是整数值,而不是字符串。