Python阅读csv问题:额外的空格

时间:2011-03-21 02:18:14

标签: python csv

当我试图解析由MS SQL 2005 express edition的查询导出的csv时,字符串python给了我完全出乎意料的。例如,如果csv文件中的行是:“ aaa,bbb,ccc,dddd“,然后当python将其解析为字符串时,它变为:”a a a a a,b b b,c c c,d d d d“类似的东西.....会发生什么??? 我试图删除代码中的空格但不起作用。

import os
import random


f1 = open('a.txt', 'r')
f2 = open('dec_sql.txt', 'w')
text = 'abc'

while(text  != ''):

    text = f1.readline()
    if(text==''):
        break

    splited = text.split(',')
    for i in range (0, 32):
        splited[i] = splited[i].replace(' ', '')

    sql = 'insert into dbo.INBOUND_RATED_DEC2010 values ('
    sql += '\'' + splited[0] + '\', '
    sql += '\'' + splited[1] + '\', '
    sql += '\'' + splited[2] + '\', '
    sql += '\'' + splited[3] + '\', '
    sql += '\'' + splited[4] + '\', '
    sql += '\'' + splited[5] + '\', '
    sql += '\'' + splited[6] + '\', '
    sql += '\'' + splited[7] + '\', '
    sql += '\'' + splited[8] + '\', '
    sql += '\'' + splited[9] + '\', '
    sql += '\'' + splited[10] + '\', '
    sql += '\'' + splited[11] + '\', '
    sql += '\'' + splited[12] + '\', '
    sql += '\'' + splited[13] + '\', '
    sql += '\'' + splited[14] + '\', '
    sql += '\'' + splited[15] + '\', '
    sql += '\'' + splited[16] + '\', '
    sql += '\'' + splited[17] + '\', '
    sql += '\'' + splited[18] + '\', '
    sql += '\'' + splited[19] + '\', '
    sql += '\'' + splited[20] + '\', '
    sql += '\'' + splited[21] + '\', '
    sql += '\'' + splited[22] + '\', '
    sql += '\'' + splited[23] + '\', '
    sql += '\'' + splited[24] + '\', '
    sql += '\'' + splited[25] + '\', '
    sql += '\'' + splited[26] + '\', '
    sql += '\'' + splited[27] + '\', '
    sql += '\'' + splited[28] + '\', '
    sql += '\'' + splited[29] + '\', '
    sql += '\'' + splited[30] + '\', '
    sql += '\'' + splited[31] + '\', '
    sql += '\'' + splited[32] + '\' '

    sql += ')'

    print sql
    f2.write(sql+'\n')


f2.close()
f1.close()

4 个答案:

答案 0 :(得分:3)

听起来像MS SQL 2005查询的输出是一个unicode文件。 python csv module无法处理unicode文件,但csv模块的文档中有一些sample code描述了如何解决问题。

或者,某些文本编辑器允许您使用不同的编码保存文件。例如,我在Notepad ++中打开了MS SQL 2005查询的结果,它告诉我该文件是UCS-2编码的,我可以从编码菜单将其转换为UTF-8。

答案 1 :(得分:-1)

尝试在记事本中打开文件并使用替换所有功能将' '替换为''

答案 2 :(得分:-1)

您的文件很可能使用2字节字符编码进行编码 - 最有可能是utf-16(但它可能是其他编码。

要让CSV正确读取它,您可以使用编解码器打开它,以便将其解码为读取 - 您可以在python程序中使用Unicode对象(而不是字符串对象)。

所以,而不是用

打开文件
my_file = open ("data.dat", "rt")

使用: 导入编解码器

my_file = codecs.open("data.dat", "rt", "utf-16") 

然后将其提供给CSV模块,其中包含:

导入csv reader = csv.reader(my_file) first_line = False 对于读者来说:    如果first_line:#skips标题行        first_line = True        继续    #assemble sql查询并发出它

另一件事是你的“查询”被构造成32行重复代码在编程时是一件好事。即使在缺乏丰富字符串处理功能的语言中,也有更好的方法可以做到这一点,但在Python中,您可以做到:

sql = 'insert into dbo.INBOUND_RATED_DEC2010 values (%s);' % ", ".join("'%s'" % value for value in splited )

而不是组装您的查询的那33行。 (我告诉它在里面插入一个字符串 第一个字符串上的括号。在%运算符之后,字符串“,”与“join”方法一起使用,以便它用于将作为参数传递的序列上的所有元素粘贴在一起以进行连接。此序列由一个字符串组成,其中包含一个值,该值包含在已拆分数组中每个值的单引号内。

答案 3 :(得分:-2)

使用Python的内置CSV阅读器可能会有所帮助。看起来像是unicode的问题,这个问题让我很沮丧。

import tkFileDialog
import csv

ENCODING_REGEX_REPLACEMENT_LIST = [(re.compile('\xe2\x80\x99'), "'"),
                                   (re.compile('\xe2\x80\x94'), "--"),
                                   (re.compile('\xe2\x80\x9c'), '"'),
                                   (re.compile('\xe2\x80\x9d'), '"'),
                                   (re.compile('\xe2\x80\xa6'), '...')]

def correct_encoding(csv_row):
    for key in csv_row.keys():
        # if there is a value for the current key
        if csv_row[key]:
            try:
                csv_row[key] = unicode(csv_row[key], errors='strict')
            except ValueError:
                # we have a bad encoding, try iterating through all the known
                # bad encodings in the ENCODING_REGEX_REPLACEMENT and replace
                # everything and then try again
                for (regex, replacement) in ENCODING_REGEX_REPLACEMENT_LIST:
                    csv_row[key] = regex.sub(replacement,csv_row[key])
                print(csv_row)
                csv_row[key] = unicode(csv_row[key])
        # if there is NOT a value for the current key
        else:
            csv_row[key] = unicode('')
    return csv_row

filename = tkFileDialog.askopenfilename()
csv_reader = csv.DictReader(open(filename, "rb"), dialect='excel') # assuming similar dialect
for csv_row in csv_reader:
    csv_row = correct_encoding(csv_row)
    # your application logic here