【问题标题】:How to read all data in csv file如何读取csv文件中的所有数据
【发布时间】:2020-10-17 15:22:28
【问题描述】:

我尝试将 csv 文件上传到数据库。但是,当我上传时,它只会将第一个数据返回到数据库中。我希望它返回 csv 文件中的每一行,但我不知道该怎么做。有人可以帮我吗?

下面是我写的代码:

models.py

from app import db

class details(db.Model):
    #Columns

    id = db.Column(db.Integer, primary_key = True, autoincrement=True)
    Name = db.Column(db.String(120), nullable=False)
    Email = db.Column(db.String(120), unique= True, nullable=False)
    Address =  db.Column(db.Text, nullable=False)


    def __init__(self, Name, Email, Address):
  
        self.Name = Name
        self.Email= Email
        self.Address = Address

上传.py

from app.models import details
import csv
from io import TextIOWrapper

def uploadCSV():


    upload = request.files.get('upload') 
    csv_file = TextIOWrapper(upload, encoding='utf-8')
    csv_reader = csv.DictReader(csv_file, delimiter=',')


    for data in csv_reader:
        name = data['name']
        email = data['email']
        address = data['address']


        query = details(Name = name, Email= email, Address = address)

        db.session.add(query)
        db.session.commit()

        return "upload"

【问题讨论】:

    标签: python mysql csv flask sqlalchemy


    【解决方案1】:

    根据您显示的缩进,您的 return "upload" 在循环的第一次迭代中执行。

    您的意思是这样做吗?

    def uploadCSV():
    
        upload = request.files.get('upload') 
        csv_file = TextIOWrapper(upload, encoding='utf-8')
        csv_reader = csv.DictReader(csv_file, delimiter=',')
    
        for data in csv_reader:
            name = data['name']
            email = data['email']
            address = data['address']
    
            query = details(Name = name, Email= email, Address = address)
    
            db.session.add(query)
            db.session.commit()
    
        return "upload"
    

    编辑添加:您真的要提交每一行,还是应该取消缩进 db.session.commit() 指令以在最后提交整个数据集(可能对您来说效果更好)?

    【讨论】:

    • 我尝试了您的建议以取消缩进返回“上传”。它仅适用于 40 左右的几行,但我的实际数据约为 400,并且错误显示“UnicodeDecodeError:'utf-8'编解码器无法解码位置 3795 的字节 0x96:无效起始字节”,错误突出显示在for data in csv_reader: 。是不是因为我的数据太大,代码处理不了?
    • 该错误是文件中的编码问题,我很确定这是由TextIOWrapper 抛出的。您能否更仔细地查看堆栈跟踪?您确定源 CSV 文件是 UTF-8 吗?根据它的来源,它可能在另一个本地化中,并且没有简单的方法来判断。很抱歉,我对此无能为力。
    • 是的。这是因为编码和来源。我把它改成'cp1252',它工作了
    • @noobCoderzz 好消息!我想这只会留下您是否应该取消缩进db.session.commit() 的问题。如果确实将其移到内部循环之外,那么加载应该会运行得更快(尽管您可能无法仅用 400 行来判断),并且任何诸如编码问题之类的错误都会导致整个加载失败(通常是一件好事)。
    【解决方案2】:

    我得到了答案! ^^

    1. 我取消缩进返回“上传”
    2. 因为我收到类似“UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 3795: invalid start byte”之类的错误。我发现我使用了错误的编码。因此,我将编码从 'UTF-8' 更改为 'cp1252' 并且成功了。
    def uploadCSV():
    
        upload = request.files.get('upload') 
        csv_file = TextIOWrapper(upload, encoding='cp1252')
        csv_reader = csv.DictReader(csv_file, delimiter=',')
    
        for data in csv_reader:
            name = data['name']
            email = data['email']
            address = data['address']
    
            query = details(Name = name, Email= email, Address = address)
    
            db.session.add(query)
            db.session.commit()
    
        return "upload"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多