如何以正确的格式返回csv中的多个coulmns

时间:2018-02-20 14:38:31

标签: python csv utf-8 export-to-excel utf-16

这是我第一次在这里发帖,我在工作中与python一起工作。我用谷歌搜索并且麻烦地把它射到了我最好的能力。

要点:
我试图获取用户名和文件名的文件,并删除所有非utf8字符。在40k左右的文件名记录列表中,有utf8,utf16和其他语言编码的混合。

问题: 我无法通过用户名和非utf8文件名正确格式化csv。我无法为每条记录及其相应的用户制作新的标签和行。我的打印声明完全适用于我需要它的外观 - 它与我所看到的完美分隔。我只是无法弄清楚要将两列写入csv。我需要Sender_Email列来保留我的主键以用于稍后的连接。

这是我的源csv的样子:

sender_email, file_name
test@test.com, utf16filename.xlxs
tester@test.com, utf16filename.xlxs 
mrstest@test.com, utf8filename1.pptx 
mctestertester@test.com, utf8filename2.pdf
mrstest@test.com, utf8filename3.docx
mctesterson@test.com, utf8filename4.docx
mrstest@test.com, utf8filename5.docx

所需输出:将所有非utf8或ascii字符翻出

sender_email, file_name
mrstest@test.com, utf8filename1.pptx 
mctestertester@test.com, utf8filename2.pdf
mrstest@test.com, utf8filename3.docx
mctesterson@test.com, utf8filename4.docx
mrstest@test.com, utf8filename5.docx

到目前为止我所拥有的 - 印刷声明正是我需要的,它的工作原理。从终端查看时,我在文件名输出中的所有结果都是utf8,我可以通过抽查查看。当我在没有Sender_Email列的情况下编写file_names列时,代码也可以工作。如果我只是编写file_name列,我只能正确地格式化csv,但是我丢失了我的主键(sender_email)。

import csv
with open ('MixedUTF8andUTF16FileNamesAndSenderEmail.csv', 'r') as inFile:
readFile = csv.reader(inFile)
for row in readFile:
    try:
        sender_email = row[0]
        file_names = row[1].decode('ascii')
        print sender_email+'\t'+file_names
        with open('asciionlycharacters.csv', 'a') as finalFile:
            finalFile.writerows(sender_email+'\t'+file_names)
    except:
        pass

当我在excel中打开它时,确切的csv是什么样子

sender_email  file_name 
utf8filename1.pptx 
utf8filename2.pdf 
utf8filename3.docx 
mctestertester@test.comutf8filename4.docx
mrstest@test.comutf8filename5.docx

1 个答案:

答案 0 :(得分:0)

这一行

finalFile.writerows(sender_email+'\t'+file_names)

没有做你认为的事情。您正在使用它在文件中写入一行,但writerows()需要一个行列表。试试这个:

finalFile.write(sender_email+'\t'+file_names+'\n')

你做try...except...pass让自己的生活变得艰难。这可以掩盖你真正想知道的各种问题。您要捕获的异常位于行

file_names = row[1].decode('ascii')

所以把try...except放在那附近。

try:
    file_names = row[1].decode('ascii')
except UnicodeDecodeError:
    continue