如何 return 格式正确的 csv 中的多列

How to return multiple coulmns in a csv with correct format

这是我第一次在这里发帖,我在工作中刚接触 python。我已经用谷歌搜索并尽我最大的能力解决了这个问题。

总结:
我正在尝试获取用户名和文件名的文件并删除所有非 utf8 字符。在40k左右的文件名记录列表中,混杂了utf8、utf16等语言编码。

问题: 我无法 python 使用用户名和非 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,从我通过抽查可以看到的结果来看。当我只写 file_names 列而没有我的 Sender_Email 列时,该代码也有效。如果我只写 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

这一行

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