在python中读取没有字符串格式的CSV

时间:2014-06-19 18:03:41

标签: python excel csv

我有一个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')

3 个答案:

答案 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文件,rowcol都是整数值,而不是字符串。