【问题标题】:How to return multiple coulmns in a csv with correct format如何以正确的格式返回 csv 中的多列
【发布时间】:2018-07-30 23:03:00
【问题描述】:

这是我第一次在这里发帖,我对在工作中使用 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

到目前为止我所拥有的 - print 语句正是我所需要的并且它有效。我在文件名输出中的所有结果都是 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

【问题讨论】:

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


    【解决方案1】:

    这一行

    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
    

    【讨论】:

    • 这成功了!我觉得有点愚蠢,因为看着这个很明显。感谢您对例外的建议。我重新跑步,它确实抓住了一些东西。感谢您的所有帮助!
    • 我很抱歉。感谢您的帮助!
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多