2016-11-28 1 views
0

4 개의 텍스트 파일 행을 모두 추가하고 5 개의 열이있는 출력 파일을 만들고 싶습니다. 내 파일 중 하나에 두 개의 열이 있습니다. 나는 csv.reader로 해보려고했지만 올바른 결과를 얻을 수는 없습니다. 이 순간에 나는이 코드 작업입니다 : 5 개의 텍스트 파일을 열 단위로 추가합니다.

from os import walk 
import csv 
mypath = 'C:\\Users\\files to append'  
o_data = [] 
files = [] 
for (dirpath, dirnames, filenames) in walk(mypath): 
    files.extend(filenames) 
    break 
print(files) 
for afile in files: 
    file_h=open(afile) 
    a_list = [] 
    a_list.append(file_h.read()) 
    csv_reader = csv.reader(file_h, delimiter = ' ') 
    for row in csv_reader: 
     a_list.append(row[0]) 
    o_data.append((n for n in a_list)) 
    file_h.close() 

with open('output.dat', 'w') as op_file: 
    csv_writer = csv.writer(op_file, delimiter = ' ') 
    for row in list(zip(*o_data)): 
     csv_writer.writerow(row) 

내 다섯 개 텍스트 파일

는 differnt 한 값으로 다음과 같이 :

SCALAR 
ND 9418 
ST 0 
TS  45000.34 
0.0000 
100.02 

결과는 다음과 같이해야한다 (4 헤더와 5 열 수) :

SCALAR SCALAR SCALAR SCALAR 
ND 9418 ND 9418 ND 9418 ND 9418 
ST 0 ST 0 ST 0 ST 0 ST 0 
TS 45000.34 TS 45000.34 TS 45000.34 TS 45000.34 
0.0000 1.0000 2.4344 4.5656 81.2123 
100.02 123.32 333.85 435.33 987.11 

나는 고맙게 여길 것이다. 2

시도 나는 다른 방법으로 그것을 다시 작성 tryed. 그래서 이것이 내 해결책이지만 제대로 작동하지 않습니다. 그것은이 코드입니다

"output.out"에 "output1.out을"이름을 바꿀 수없는 이유를 이해 할 수 없습니다

수입 OS

"" " 는에 모든 bnecessary 데이터를 넣어주세요 디렉토리 는 "" "

f = [] 
for file in os.listdir('C:\\Users\\Append'): 
    if file.endswith(".dat"): 
     f.append(file) 
     print(file) 
     os.rename(file,"input.dat") 
     file = file.rsplit('.', 1)[0] 
     print(file) 
     with open("output.out", "r") as textfile1, open("input.dat", "r") as textfile2,\ 
      open("output1.out", "w") as out: 
      for x, y in zip(textfile1, textfile2): 
       x = x.strip() 
       y = y.strip() 
       print("{0} {1}".format(x, y), file = out) 
       print(fname) 
     os.rename("input.dat", file+".txt") 
    os.rename("output1.out", "output.out") 
print(f) # just for checking 

답변

1

다음은 당신이 찾고있는 무엇을해야한다. os.walk()을 사용하는 대신 적절한 파일 목록을 얻기 위해 glob.glob()을 사용합니다. 파일 이름에 따라 i*.dat을 사용하거나 모든 dat 파일에 대해 *.dat을 사용할 수 있습니다.

각 파일을 data 목록으로 읽어 들인 다음 zip(*data) 트릭을 사용하여 행의 열로 열을 읽습니다. 그런 다음 chain.from_iterable()을 사용하여 각 행의 각 목록을 하나의 목록으로 결합한 다음이를 구분 기호로 공백을 포함하여 출력 CSV 파일에 씁니다.

from itertools import chain 
import glob 
import csv 

with open('output.csv', 'w', newline='') as f_output: 
    csv_output = csv.writer(f_output, delimiter=' ') 
    data = [] 

    for filename in glob.glob('c*.txt'): 
     with open(filename, newline='') as f_input: 
      csv_input = csv.reader(f_input, delimiter=' ', skipinitialspace=True) 
      data.append(list(csv_input)) 

    for row in zip(*data): 
     csv_output.writerow(chain.from_iterable(row)) 

당신에게 같은주기 :

SCALAR SCALAR SCALAR SCALAR SCALAR 
ND 9418 ND 9419 ND 9420 ND 9421 ND 9422 
ST 0 ST 1 ST 2 ST 3 ST 4 
TS 45000.34 TS 45000.35 TS 45000.36 TS 45000.37 TS 45000.38 
0.0000 0.0001 0.0002 0.0003 0.0004 
100.02 100.03 100.04 100.05 100.06 
+0

를 그것이 erorr 제공 : csv_output.writerow (chain.from_iterable (행)) 오류 : 순서가 –

+0

그것은 파이썬 버전에 따라 다릅니다 수있는 예상 시도 'csv_output.writerow (list (chain.from_iterable (row)))' –

+0

예! 그것은 작동합니다. 나는 네가 어떻게 지내는지 본다. THX –

관련 문제