2017-10-03 23 views
1

私はcsv(ローカル名で連結)の最初の列からQRコードを生成するPythonスクリプトを書いています。その部分はうまく機能します。 CSVはちょうど3つの列があり、次のようになります。CSVを読み込み、QRコードを作成し、そのファイル名を新しい列に書き込む方法?

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

をそして私は、そのファイルを取るID S(この場合は、「NBC」)に接頭辞を追加して、QRコードを作成するために、私のPythonスクリプトを使用します新しいフォルダの各レコードに対してそれは少し長いですが、これもすべて正常に動作するようです:

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のフォルダを作成し、コピーした各csvファイル1つのサブフォルダに、各ID(NBC-144NBC-491NBC-104のためのQRコードを作成し、 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) 

ファイルパスとファイル名の列を追加するために、既存のスクリプト内にそのようなことを書くことはできますか?私がしようとするものはすべて、特に同じスクリプトでそれをやろうとすると壊れます。


EDIT:

これは

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

はまた、それは別のスクリプトではまだだ、既存のファイルを上書きし、私の最も近い試みです。

+0

@martinueauこんにちは - それは別の言語でこのような何かを書く方が良いでしょう、またはタグので、それをあるので、あなたは、タイトルからのPythonを削除しました/ scriptsは既にそれを知らせていますか? – Ryan

+0

[** _質問にはタイトルに「タグ」が含まれていますか?_ **](https://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-the-titles) 。 – martineau

+0

@martineauああありがとう。この他の助けは素晴らしいでしょう! – Ryan

答えて

1

私はあなたの質問に直接コードを実行することができないので、私はテストのために以下の部分をコメントアウトしなければならなかったが、1つのスクリプトで1つのループですべてをやっていると思う。サンプル入力データから

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 
+0

@martinueaありがとう!私は少し後にそれをテストします。また、 - これは全く別の話題かもしれません - それは絶対ファイルパスを返していますか?ここでの最終的な目標は、QRコードを含むフォルダとファイル名のスプレッドシートを誰かに送ることができ、自分のコンピュータ上で他の場所に保存してもローカルで使用できることです。 – Ryan

+0

このコードでは、現時点の作業ディレクトリ(cwd)に対して相対的にすべてのファイルパスが使用されます。新しいCSVファイルのパスもサンプル出力からわかるように相対パスです。'NBC'サブディレクトリを' image'サブディレクトリと 'files'サブディレクトリと一緒にコピーして作成したすべてのファイルのコピーを作成することができます。また、パス名は新しい場所に比べて正しいでしょう。 – martineau

+0

これは素晴らしい作品です!どうもありがとうございます! – Ryan

関連する問題