代码之家  ›  专栏  ›  技术社区  ›  Ryan

如何读取CSV,创建二维码,并将其文件名写入新列?

  •  1
  • Ryan  · 技术社区  · 8 年前

    我正在编写一个Python脚本,从csv中的第一列(与本地名称连接)生成QR码,这一部分工作得很好。csv只有三列,如下所示:

    ID    First    Last
    144   Jerry    Seinfeld
    491   George   Costanza
    104   Elaine   Benes
    99    Cosmo    Kramer
    

    我使用Python脚本获取该文件,在 ID NBC '),然后在新文件夹中为每个记录创建二维码。虽然有点长,但所有这些似乎都很好:

    import csv
    import qrcode
    import os
    import shutil
    import time
    import inquirer
    
    #Identify Timestamp
    timestr = time.strftime("%Y%m%d-%H%M%S")
    
    local = 'NBC'
    
    #Load csv
    filename = "stackoverflowtest.csv"
    
    #Path to new local folder
    localfolder = local
    localimagefolder = localfolder+'/image'
    localfilefolder = localfolder+'/files'
    
    #Check/create folders based on local
    if not os.path.exists(localfolder):
        os.makedirs(localfolder)
    if not os.path.exists(localimagefolder):
        os.makedirs(localimagefolder)
    if not os.path.exists(localfilefolder):
        os.makedirs(localfilefolder)
    
    #Copy uploaded file to their local's file folder
    shutil.copy2(filename, localfilefolder+'/'+local+'-'+timestr+'.csv') # complete target filename given
    
    #Read csv and generate QR code for local+first column of csv
    with open(filename, 'rU') as csvfile:
        next(csvfile, None) #skip header row
        reader = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab)
    
        for i, row in enumerate(reader):
            labeldata = row[0] #Choose first column of data to create QR codes
            print labeldata
    
            qr = qrcode.QRCode(
                version=1,
                error_correction=qrcode.constants.ERROR_CORRECT_L,
                box_size=10,
                border=4,
            )
    
            qr.add_data(local+"-"+labeldata)
            qr.make()
    
            img = qr.make_image()
            img.save(localimagefolder+"/"+local+"-"+labeldata+".png".format(i)) #Save image
    

    NBC-144 , NBC-491 , NBC-104 , NBC-99 )在另一个。

    我遇到问题的部分是打开csv并将文件路径/文件名写回csv(或csv的副本,因为从我读到的内容来看,我可能无法对同一个文件执行此操作)。这可能吗?

    我使用的最接近实际的脚本是在本地名称后面附加ID并将其写回列,但我似乎不知道如何对变量执行相同的操作,更不用说文件路径/文件名了:

    import csv
    import os
    import sys
    
    filename = 'stackoverflowtest.csv'
    newfilename = 'stackoverflowtest2.csv'
    local = 'NBC'
    
    with open(filename, 'rU') as f:
        reader = csv.reader(f)
        with open(newfilename, 'w') as g:
            writer = csv.writer(g)
            for row in reader:
                new_row = row[0:] + ['-'.join([local, row[0]])]
                writer.writerow(new_row)
    

    可以在我现有的脚本中编写类似的内容来添加文件路径和文件名的列吗?我尝试的每件事都会中断——特别是如果我尝试用同一个脚本来做。


    这是我最近一次重写现有文件的尝试

    f=open(newfilename,'r+')
    w=csv.writer(f)
    for path, dirs, files in os.walk(path):
        for filename in files:
            w.writerow([newfilename])
    

    而且它仍然在一个单独的脚本中。

    1 回复  |  直到 8 年前
        1
  •  1
  •   martineau    8 年前

    因为我不能直接运行你问题中的代码,我不得不在下面的测试中注释掉部分代码,但我认为它在一个脚本的一个循环中完成了你想要的一切。

    import csv
    #import qrcode
    import os
    import shutil
    import time
    #import inquirer
    
    # Identify Timestamp
    timestr = time.strftime("%Y%m%d-%H%M%S")
    
    local = 'NBC'
    
    # Load csv
    filename = "stackoverflowtest.csv"
    
    # Path to new local folder
    localfolder = local
    localimagefolder = os.path.join(localfolder, 'image')
    localfilefolder = os.path.join(localfolder, 'files')
    
    # Check/create folders based on local
    if not os.path.exists(localfolder):
        os.makedirs(localfolder)
    if not os.path.exists(localimagefolder):
        os.makedirs(localimagefolder)
    if not os.path.exists(localfilefolder):
        os.makedirs(localfilefolder)
    
    # Copy uploaded file to their local's file folder
    target = os.path.join(localfilefolder, local+'-'+timestr+'.csv') # Target filename
    #shutil.copy2(filename, target)  # Don't need to do this.
    
    # Read csv and generate QR code for local+first column of csv
    with open(filename, 'rb') as csvfile, open(target, 'wb') as outfile:
        reader = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab)
        writer = csv.writer(outfile, delimiter=',', dialect=csv.excel_tab)
        next(reader)  # Skip header row.
    
        for row in reader:
            id, first, last = row
    
    #        qr = qrcode.QRCode(
    #            version=1,
    #            error_correction=qrcode.constants.ERROR_CORRECT_L,
    #            box_size=10,
    #            border=4,
    #        )
    #
    #        qr.add_data(local+"-"+id)
    #        qr.make()
    #
    #        img = qr.make_image()
            imagepath = os.path.join(localimagefolder, local+"-"+id+".png")
    #        img.save(imagepath) # Save image.
            print "saving img:", imagepath
    
            writer.writerow(row + [local+'-'+id, imagepath])
    

    144,Jerry,Seinfeld,NBC-144,NBC/image/NBC-144.png
    491,George,Costanza,NBC-491,NBC/image/NBC-491.png
    104,Elaine,Benes,NBC-104,NBC/image/NBC-104.png
    99,Cosmo,Kramer,NBC-99,NBC/image/NBC-99.png