Kolega paprašė susitvarkyti su viena kvaila užduotimi. Yra aibė direktorijų, kurių viduje yra krūva subdirektorijų, kuriuose kiekvienoje yra po tekstinį failiuką „info.txt”. Kiekviename failiuke yra 3 eilutės teksto (timestamp, id numeris ir klasifikatorius). Reikia iš visų tų failiukų suformuoti vieną gražų CSV failą. Rankomis tokia užduotis praktiškai neįmanomą (kolega per pusdienį „surinko” į vieną failą gal tik 250 failiukų), bet su python ji yra išties labai lengva.
Po pusvalanduko praleisto stackoverflow.com forume gavosi štai toks paprastas scriptas, kuris perknisa visą direktorijų medį (pavyzdys viršuje), suranda visus tekstinius failus ir iš jų turinio suformuoja gražų failiuką „out.csv”.
import os import csv import itertools rootdir = r'C:\test' output = r'C:\out.csv' with open(output, 'w') as out_file: writer = csv.writer(out_file) writer.writerow(('TimeStamp', 'ID', 'CLASS')) for subdir, dirs, files in os.walk(rootdir): for file in files: if file.endswith(".txt"): print(os.path.join(subdir, file)) with open(os.path.join(subdir, file), 'r') as in_file: stripped = (line.strip() for line in in_file) lines = (line for line in stripped if line) grouped = itertools.izip(*[lines] * 3) with open(output, 'a') as out_file: writer = csv.writer(out_file) writer.writerows(grouped)
Manau, kad tikri python programuotojai galėtų ir paprastesnį scriptą suregzti, bet man ir tokio pilnai užteko. Svarbiausia, kad savo darbą atliko tiesiog idealiai.
Naudinga literatūra:
- http://stackoverflow.com/questions/19587118/python-iterating-through-directories
- http://stackoverflow.com/questions/17749058/combine-multiple-text-files-into-one-text-file-using-python
- http://stackoverflow.com/questions/2363731/append-new-row-to-old-csv-file-python
- http://stackoverflow.com/questions/19932130/python-iterate-through-folders-then-subfolders-and-print-filenames-with-path-t
- http://stackoverflow.com/questions/17749484/python-script-to-concatenate-all-the-files-in-the-directory-into-one-file
- http://stackoverflow.com/questions/2512386/how-to-merge-200-csv-files-in-python
- http://stackoverflow.com/questions/4706499/how-do-you-append-to-a-file-in-python
- http://stackoverflow.com/questions/14820480/convert-csv-to-txt-and-start-new-line-every-10-values-using-python
- http://stackoverflow.com/questions/3964681/find-all-files-in-directory-with-extension-txt-with-python