2017-01-09 41 views
1

調用data_storage.py中的函數data_save_csv(寫入.csv文件中的數據),但它錯誤:TypeError:類似字節的對象是必需的,而不是 '海峽',你能告訴我該怎麼解決呢Python錯誤:需要類似字節的對象,而不是FBCrawl.py中的'str'

FBCrawl.py:

header = ["id","name","administrator"] 
data_storage.data_save_csv("group_members",group_info_result,"1610393525875114",header) 

data_storage.py:

#write data in .csv file 
def data_save_csv(type,data,id_name,header,since = None): 
    #get the date when storage data 
    date_storage() 
    #create the data storage directory 
    csv_parent_directory = os.path.join("dataset","csv",type,glovar.date) 
    directory_create(csv_parent_directory) 
    #write data in .csv 
    if type == "group_members": 
     csv_file_prefix = "gm" 
    if since: 
     csv_file_name = csv_file_prefix + "_" + since.strftime("%Y%m%d-%H%M%S") + "_" + time_storage() + id_name + ".csv" 
    else: 
     csv_file_name = csv_file_prefix + "_" + time_storage() + "_" + id_name + ".csv" 
    csv_file_directory = os.path.join(csv_parent_directory,csv_file_name) 

    with open(csv_file_directory,'wb') as csvfile: 
     writer = csv.writer(csvfile,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL) 

     #csv header 

     writer.writerow(header) 

     row = [] 
     for i in range(len(data)): 
      for k in data[i].keys(): 
       row.extend(data[i][k]) 
       writer.writerow(row) 

錯誤:

C:\Python\Python36\python.exe  
C:/Python/PyCharmProject/FaceBookCrawl/FBCrawl.py 
1060327860756932|Qp-F2RNW_n5HxrVPP2saNJA4PB0 
Traceback (most recent call last): 
File "C:/Python/PyCharmProject/FaceBookCrawl/FBCrawl.py", line 225, in <module> 
data_storage.data_save_csv("group_members",group_info_result,"1610393525875114",header) 
File "C:\Python\PyCharmProject\FaceBookCrawl\data_storage.py", line 43, in data_save_csv 
writer.writerow(header) 
TypeError: a bytes-like object is required, not 'str' 

Process finished with exit code 1 

回答

2

寫入器引用的CSV文件是使用wb(寫入二進制)標誌打開的,這意味着您必須使用字節數組來寫入它。

只是轉換header到字節數組當你寫:

writer.writerow(header.encode()) 

你可以只使用w標誌或者打開該文件(這將讓你寫字符串):

open(csv_file_directory, 'w') 
2

如果您使用python3,寫入模式應該是'w',而不是'wb'。

>>> import csv 
>>> headers = ['ab', 'cd'] 
>>> with open('out.csv', 'wb') as f: 
...  writer = csv.writer(f) 
...  writer.writerow(headers) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
TypeError: a bytes-like object is required, not 'str' 


>>> with open('out.csv', 'w') as f: 
...  writer = csv.writer(f) 
...  writer.writerow(headers) 
... 
7 
>>> 

「WB」是二進制模式,所以python3假設你會寫編碼字節串到你的文件; 'w'是文本模式,所以python3需要unicode字符串,這是您的標題列表包含的內容。

+0

就是這樣。完全錯過了Python3。謝謝@snakecharmerb –

相關問題