2017-11-08 22 views
0

큰 csv 파일을 가져와 열의 특정 단어를 기반으로 여러 csv 파일로 분할하는 코드를 작성했습니다. 원본 csv 파일에는 문자열 인 일부 필드가 있으며 주위에 따옴표가 있습니다. 예를 들어문자열을 따옴표로 묶어서 csv 작성하기 (Python)

:

Field1,Field2,Field3,Field4 
1,2,"red",3 
1,4,"red",4 
3,4,"blue",4 

내 코드 입력란 4에 따라 별도의 CSV를로 파일을 분할합니다.

내 출력은 다음과 같습니다

내 출력 파일이 문자열 주위에 따옴표가있는 경우에만 작동 소프트웨어의 조각에 공급 필드 3에 문자열 따옴표를 유지하려는
3.csv 
Field1,Field2,Field3,Field4 
1,2,red,3 

4.csv 
Field1,Field2,Field3,Field4 
1,4,red,4 
3,4,blue,4 

, 그것은 꽤 성가시다.

나의 현재 코드는 다음과 같습니다

import csv 

#Creates empty set - this will be used to store the values that have already been used 
newfilelist = set() 

#Opens the large csv file in "read" mode 
with open('File.csv, 'r') as csvfile: 

    #Read the first row of the large file and store the whole row as a string (headerstring) 
    read_rows = csv.reader(csvfile) 
    headerrow = next(read_rows) 
    headerstring=','.join(headerrow) 
    for row in read_rows: 

     #Store the whole row as a string (rowstring) 
     rowstring=','.join(row) 

     #Takes Field 4 
     newfilename = (row[3]) 


     #This basically makes sure it is not looking at the header row. 
     if newfilename != "field4": 


      #If the newfilename is not in the newfilename set, add it to the list and create new csv file with header row. 
      if newfilename not in newfilelist:  
       newfilelist.add(newfilename) 
       with open('//output/' +str(newfilename)+'.csv','a') as f: 
        f.write(headerstring) 
        f.write("\n") 
        f.close()  
      #If the newfilename is in the newfilelist set, append the current row to the existing csv file.  
      else: 
       with open('//output/' +str(newfilename)+'.csv','a') as f: 
        f.write(rowstring) 
        f.write("\n") 
        f.close() 

는 사람이 어떻게 문자열 주위에 따옴표를 얻을 내게 조언을 할 수 있습니까? 불행히도 내 파일을 사용하는 소프트웨어는이 파일 형식이어야합니다!

+0

은 아마이 https://stackoverflow.com/questions/36628847/keep-double-quotes-in-a-text-file-using-csv-reader –

답변

0

패스 quoting=csv.QUOTE_NONNUMERIC ~ csv.writer().

0

CSVwriter는 당신이하려는 것을 과용 할 수 있습니다. 전체 행을 변경하지 않으려면 전체 행을 씁니다.

#Creates empty array - this will be used to store the values that have already been used 
newfilelist = {} 

#Opens the large csv file in "read" mode 
with open('File.csv, 'r') as csvfile: 

    #Read the first row of the large file and store the whole row as a string (headerstring) 
    headerstring = csvfile.readline() 
    for row in csvfile.readlines(): 

     #Takes Field 4 
     newfilename = row.split(',')[3].strip('"') 

     #If the newfilename is not in the newfilename set, add it to the list and create new csv file with header row. 
     if newfilename not in newfilelist:  
      newfilelist[newfilename] = open('//output/' +str(newfilename)+'.csv','w'): #open a file and store the file reference in an dictionary 
      newfilelist[newfilename].write(headerstring) 

     newfilelist[newfilename].write(row) # Write out a row to an existing file 

#Close all open files 
for k in newfilelist.keys(): 
    newfilelist[k].close() 
+0

이 코드의 DUP 파일 경우 깰 것 같다 크기가 크지 만 초기 코드가 작동합니다. MemoryError는 "for csvfile.readlines() : 행"에 있습니다. – Actuary

+0

출력 논리가 많은 파일을 생성하는 경우 놀라운 것은 아닙니다. 더 이상 파일에 쓰지 않는 지점을 알고 있다면 끝까지 기다리지 않고 먼저 닫을 수 있습니다. – WombatPM

+0

데이터를 정렬해야 할 것 같습니까? 반드시 순서가 없으며 수만 개의 파일이있을 수 있습니다. 데이터를 정렬하는 것은 초기 파일 크기가 여러 기가 바이트 인 까다로운 일일 것이라고 생각합니다! – Actuary