2017-07-24 65 views
0

我有一个Python中的字典(最新版本)的问题。 这里是我的字典: [ {dict1} , {dict2} , ... ] 所有字典是类似于:问题Python写作 - 读取字典的CSV

{'Date': '2016-10-17', 
    'Message_body': ' Version française BUSINESS EVENTS - SPRING 2016 April 5: YESS EVENT ON SCALING UP Robin Bonsey, Hystra Consultant, will discuss business solutions to the predicament of small holder farmer', 
    'Sender': '[email protected]', 
    'Subject': 'Fwd: Inclusive business events - spring 2016'} 

根据Python,每个值(type(dict1['Message_body']))的'类型'是“str”。 我的问题是将此词典词典转换为CSV文件(使用密钥'Date' , 'Message_body' , 'Sender', 'Subject')。 这里是我的代码:

def export_dict_list_to_csv(data, filename): 
    with open(filename, 'w',encoding='utf-8',newline='') as f: 
     # Assuming that all dictionaries in the list have the same keys. 
     headers = sorted([k for k, v in data[0].items()]) 
     csv_data = [headers] 

     for d in data: 
      csv_data.append([d[h] for h in headers]) 

     writer = csv.writer(f) 
     writer.writerows(csv_data) 


export_dict_list_to_csv(final_list, 'chili.csv') 

它工作得很好,但错字很奇怪。 例如,在.csv中,我有“Chaque moi voudraitêtrele tyran de tous les autres»dit Pascal dans lesPensées”,而不是“Chaque moi voudraitêtretyran de tous les autresàdit Pascal dans lesPensées ”。在“str”形式中,我有“良好的错字”,但在.csv中,它不是很好的错字(我不知道为什么)。如果“读取”CSV文件恢复“str”的良好初始输入错误,则此问题并不重要。

但我没有成功读取正确的CSV创建... 我想:

with open('chili.csv', 'r') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',') 
    for row in spamreader: 
     print (row) 

,我得到错误“的UnicodeDecodeError:‘ASCII’编解码器不能解码位置字节0xc3 1087:序数不在范围内(128)”

,我尝试:

with open('/Users/Marco/HandB/Gmail/chili.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',') 
    for row in spamreader: 
     print (row) 

错误:(?你以文本模式打开文件),迭代器应该返回字符串,而不是字节

所以我有2个问题: 1)我写CSV文件的方式是一种好方法吗?为什么我在CSV上有一个奇怪的错字?

2)如何读取之前创建的CSV? 我在互联网上搜索了几个小时,但我没有找到任何特别的东西来帮助我解决这个问题。特别是,我不太清楚围绕“编码”问题的所有问题,我只知道字典中的值是str类型,我认为它们是UTF-8格式。 下面是代码:(我清理“数据”,从GMAIL API收到)

mssg_parts = payld['parts'] # fetching the message parts 
part_one = mssg_parts[0] # fetching first element of the part 
part_body = part_one['body'] # fetching body of the message 
part_data = part_body['data'] # fetching data from the body 
clean_one = part_data.replace("-","+") # decoding from Base64 to UTF-8 
clean_one = clean_one.replace("_","/") # decoding from Base64 to UTF-8 
clean_two = base64.b64decode (bytes(clean_one, 'UTF-8')) # decoding from Base64 to UTF-8 
soup = BeautifulSoup(clean_two , "lxml") 
soup = BeautifulSoup(clean_two, "html") 
soup.get_text()      
mssg_body = soup.body()    
# mssg_body is a readible form of message body 
# depending on the end user's requirements, it can be further cleaned 
# using regex, beautiful soup, or any other method 
temp_dict['Message_body'] = mssg_body 

我写下这给我提供了“新的讯息”的一部分,因为它可以帮助你理解的格式的代码消息及其转换为CSV文件。

非常感谢! :)

+1

看来你是在python3上。尝试像这样设置编码:'open('/ Users/Marco/HandB/Gmail/chili.csv','r',encoding ='utf-8')as csvfile:' –

+0

谢谢coldspeed for your answer !你说得对,实际上它和“编码”一起工作,错字很好! ^^最后一个问题:我如何重新创建一个“字典”这个“阅读CSV”?谢谢:) – Eliot

+0

已经发布了一个答案。如果您觉得有帮助,请考虑将其标记为已接受。 –

回答

1

看来你是在python3。您需要以文本模式打开文件,而不是二进制模式。此外,如果您的数据有一些特殊字符,请在调用open打开要读取的文件时设置编码。这可以用encoding=...做到:

with open('/Users/Marco/HandB/Gmail/chili.csv', 'r', encoding='utf-8') as csvfile: 
    reader = csv.reader(csvfile) 
    ... 

如果你想在你的CSV作为字典阅读,你应该考虑考虑看看csv.DictReader的文档有一些方便的例子,让你开始。

+1

谢谢你的回答。最后我用'open('/ Users/Marco/HandB/Gmail/chili.csv','r',encoding ='utf-8')作为csvfile: reader = csv.DictReader(csvfile,['日期','Message_body','发件人','主题'],分隔符=“,”) ron = list(读者)' 它的工作原理!再次感谢您的帮助,我明白了:) – Eliot