2017-10-03 5 views
1

(로컬 이름과 연결된) CSV의 첫 번째 열에서 QR 코드를 생성하는 Python 스크립트를 작성 중이며 해당 부분이 잘 작동합니다. csv로는 세 개의 열을 가지고 다음과 같습니다CSV를 읽고, QR 코드를 만들고, 파일 이름을 새 열에 쓰는 방법?

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

그리고 QR 코드를 생성 한 후, 해당 파일을 취하는 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의 폴더를 생성, 복사 각 csv 파일 하나 개의 하위 폴더에, 각 ID (NBC-144, NBC-491, NBC-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) 

파일 경로 및 파일 이름에 대한 열을 추가하기 위해 기존 스크립트에 이와 비슷한 내용을 쓸 수 있습니까? 내가 시도하는 모든 것은 - 특히 내가 같은 스크립트에서 그것을 시도한다면.


편집 :

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 안녕 - 그것은 다른 언어로 같은 것을 쓰는 것이 좋습니다 또는 태그 때문입니다 때문에 당신은 제목에서 파이썬을 제거 않았다/scripts 이미 알았습니까? – Ryan

+0

[** _ 질문에 제목에 "태그"를 포함해야합니까? _ **] (https://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) 요약 . – martineau

+0

@martineau 아 감사합니다. 이것에 대한 다른 도움은 아주 좋습니다! – Ryan

답변

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