如何 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
这是我第一次在这里发帖,我在工作中刚接触 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