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

How to Read CSV, Create a QR Code, and Write its Filename to New Column?

我正在编写一个 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 = "Whosebugtest.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文件夹,将每个csv文件复制到一个子文件夹中,并为每个ID创建QR码(NBC-144NBC-491NBC-104NBC-99) 在另一个.

我 运行 遇到问题的部分是打开 csv 并将 filepath/filename 写回 csv(或 csv 的副本,因为从我读过的内容,我可能不能对同一个人这样做)。这可能吗?

我最接近的脚本是将 ID 附加到本地名称并将其写回列,但我似乎无法弄清楚如何对变量执行相同的操作,让单独一个filepath/filename:

import csv
import os
import sys

filename = 'Whosebugtest.csv'
newfilename = 'Whosebugtest2.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])

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

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

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 = "Whosebugtest.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