[英]how to upload and read csv file in django using csv.DictReader?
我正在通過上傳讀取csv文件並嘗試將所有值存儲在列表中
def upload(request):
paramFile = request.FILES['file'].read()
data = csv.DictReader(paramFile)
list1 = []
for row in data:
list1.append(row)
print list1
FILE.CSV
12345,abcdef
產量
[{'1': '', None: ['']}, {'1': '2'}]
我想在list1
追加所有值
如果你使用的是Python 3,這應該可行。
file = request.FILES['file']
decoded_file = file.read().decode('utf-8').splitlines()
reader = csv.DictReader(decoded_file)
for row in reader:
# Get each cell value based on key-value pair.
# Key will always be what lies on the first row.
我們可以使用splitlines()
創建的列表。 splitlines()
被調用,因為csv.DictReader
期望“ 任何支持迭代器協議的對象,並且每次調用next ()方法時都返回一個字符串 - 文件對象和列表對象都是合適的 ”。
在Python 3中,要獲取正確的類型(字符串而不是字節)而不將整個文件讀入內存,您可以使用生成器逐行解碼:
def decode_utf8(input_iterator):
for l in input_iterator:
yield l.decode('utf-8')
def upload(request):
reader = csv.DictReader(decode_utf8(request.FILES['file']))
for row in reader:
print(row)
你有兩個問題:
您正在將字符串傳遞給DictReader
的構造DictReader
。 您必須傳遞一個可迭代對象,該對象在輸入中提供單獨的行(一個字符串是可迭代的,但每次只給一個字符一個)。 幸運的是, UploadedFile
對象(與FILES
字典中的對象一樣)已經是支持迭代的類文件對象,所以只需執行以下操作:
data = csv.DictReader(request.FILES['file'])
您的輸入數據只有一行。 DictReader
將使用該行作為列“headers”,這將成為結果詞典中的關鍵。 那么你將沒有數據! 看起來你不想要一個DictReader
,只是一個傳統的reader
:
data = csv.reader(request.FILES['file'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.