2017-04-24 7 views
2

列の配置を失うことなく、複数のcsvファイルをPythonを使用してtxtに変換します。次のようにpython - 列の配置を失うことなくcsvをtxtに変換します。

スペースまたはタブなしでコンマ区切りでcsvファイルの例は、表示されます:

"Products" "Technologies" Region1 Region2 Region3 
Prod1  Tech1   16  0  12 
Prod2  Tech2   0  12  22 
Prod3  Tech3   22  0  36 

しかし、私のスクリプトを使用して、私は次で終わる:

"Products" "Technologies" Region1 Region2 Region3 
Prod1 Tech1 16 0 12 
Prod2 Tech2 0 12 22 
Prod3 Tech3 22 0 36 

区切り文字の選択は任意です。私が望むものを達成する比較的簡単な方法はありますか?csvファイルを持つテーブルは次元が異なり、列ヘッダーの長さは変わるでしょうか?

私は、次のPythonのコードを使用します。

import os 
import fileinput 
dire = "directory" 

# function for converting csv files to txt 
def csv_to_txt(names, txtfilename): 

    # remove existing txt file 
    if os.path.exists(dire + txtfilename + ".txt"): 
     os.remove(dire + txtfilename + ".txt") 

    # open the include file 
    includefile = open(dire + txtfilename + ".txt", "a") 

    # handle the csv files and convert to txt 
    with open(names, "a+") as input_file: 
     lines = [line.split(",", 2) for line in input_file.readlines()] 
     print lines 
     text_list = [" ".join(line) for line in lines] 

     for line in text_list: 
      includefile.write(line) 
    includefile.close() 


csv_to_txt(dire + "01.csv", "nameofoutputfile") 

for line in fileinput.FileInput(dire + "nameofoutputfile" + ".txt",inplace=1): 
    line = line.replace('"','') 
    line = line.replace(',',' ') 
+0

申し訳ありません申し訳ありませんが、私はあなたが今何をしたいの違いが表示されません。 – Allen

+0

ここでは、実際の結果と期待される両方の結果が同じです。あなたは何か間違ったものを入力することがあります –

+0

あなたのtxtファイルを書くためにどのようなコードを使いますか? – pingul

答えて

2

CSVファイルが何の書式設定やアライメント情報を運ばない、それはカンマで区切られたデータだけです。通常はcsvをかなりレンダリングするのはテーブルプロセッサジョブです。

リストまたは辞書にファイルを読み込むには、csv標準モジュールを使用します。きれいな印刷で最高の結果を得るには、PrettyTableまたはPTableのフォークhttps://pypi.python.org/pypi/PTable/0.9.0を使用してください。その他のツールは、https://pypi.python.org/pypi/tabulateまたはテキストテーブルhttps://oneau.wordpress.com/2010/05/30/simple-formatted-tables-in-python-with-texttable,https://pypi.python.org/pypi/beautifultable/です。 PTable

シンプル snippetは同様に行う可能性がありますいくつかの簡単なテーブルの場合
from prettytable import from_csv 
    fp = open("myfile.csv", "r") 
    mytable = from_csv(fp) 
    fp.close() 
    mytable.border = False 
    print mytable.get_string() 

個人的に、私はパッケージで特別な手間をかけずにテーブルを印刷しなければならなかったときに、私はいくつかの特別な文字列フォーマットを使用しますが、パッケージは通常より多くのオプションをサポートしています。努力する価値があるかもしれない。


プリティテーブルが最も人気のある(偉大な名前)ようです。 集計claims最もきれいなテーブルのプリンタよりも優れた性能、asciitableを保存(astropy.io.ascii今、あなたはロケット科学者でない限り、やり過ぎのビットであるかもしれない)

+0

ハイSerge、 私は正しい方向に私を指摘していただきありがとうございます。これは私が探していたものです。 –

+0

いつでも、幸運。回答が役に立ったと思っても、それをアップウォートまたは受け入れることを躊躇しないでください。 – Serge

0

私は.CSVを開くプログラムを作ってきたし、 (うまくいけば)正確に何をしたいん:

import tkinter as tk 
from tkinter import filedialog 
import os 
import csv as csv_package 

def fileopen(): 
    GUI=tk.Tk() 
    filepath=filedialog.askopenfilename(parent=GUI, 
             title='Select file') 
    (GUI).destroy() 
    return (filepath) 

filepath = fileopen() 
filepath = os.path.normpath(filepath) 
data = [] 
with open(filepath) as fp: 
    reader = csv_package.reader(fp, skipinitialspace=True) 
    for row in reader: 
     data.append(row) 

#make spreadsheet rows consistent length, based on longest row 
max_len_row = len(max(data,key=len)) 
for row in data: 
    if len(row) < max_len_row: 
     append_number = max_len_row - len(row) 
     for i in range(append_number): 
      row.append('') 

#create dictionary of number of columns 
longest = {} 
for times in range(len(data[0])): 
    longest [times] = 0 

#get longest entry for each column 
for sublist_index,sublist in enumerate(data): 
    for column_index,element in enumerate(sublist): 
     if longest [column_index] < len(element): 
      longest [column_index] = len(element) 

#make each column as long as the longest entry 
for sublist_index,sublist in enumerate(data): 
    for column_index,element in enumerate(sublist): 
     if len(element) < longest [column_index]: 
      amount_to_append = longest [column_index] - len(element) 
      data [sublist_index][column_index] += (' ' * amount_to_append) 

with open(filepath, 'w', newline='') as csvfile: 
    writer = csv_package.writer(csvfile) 
    for row in data: 
     writer.writerow(row) 

path, ext = os.path.splitext(filepath) 
os.rename(filepath, path + '.txt') 

前:

"Products","Technologies",Region1,Region2,Region3 
Prod1,Tech1,16,0,12 
Prod2,Tech2,0,12,22 
Prod3,Tech3,22,0,36 

後:

Products,Technologies,Region1,Region2,Region3 
Prod1 ,Tech1  ,16  ,0  ,12  
Prod2 ,Tech2  ,0  ,12  ,22  
Prod3 ,Tech3  ,22  ,0  ,36 
+0

こんにちはnew_to_coding、 ありがとうございました。私もこの仕事をしました。 –

関連する問題