簡體   English   中英

如何使用csv.DictReader上傳和讀取django中的csv文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM