Я хочу конвертировать несколько CSV-файлов в TXT, используя Python без потери выравнивания столбцов.

Пример файла 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(',',' ')
2
Leedoe 24 Апр 2017 в 15:37

2 ответа

Лучший ответ

CSV-файлы не содержат информации о форматировании или выравнивании, это просто данные, разделенные запятой. Обычно это задача табличного процессора, чтобы сделать csv довольно красивым.

Для чтения файла в список или словарь используйте стандартный модуль CSV. Для достижения наилучших результатов в красивой печати используйте PrettyTable или PTable fork 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

   from prettytable import from_csv
   fp = open("myfile.csv", "r")
   mytable = from_csv(fp)
   fp.close()
   mytable.border = False
   print mytable.get_string()

Для нескольких простых таблиц может быть простой фрагмент делай так же.

Лично, когда мне приходилось распечатывать таблицу без лишних хлопот с пакетами, я использовал бы специальное форматирование строк, но пакеты, как правило, более надежные, поддерживают много опций, поэтому, если вы собираетесь работать со многими таблицами, это может стоить усилия .


Prettytable кажется самым популярным (великое имя). В табличном виде заявляет о лучшей производительности, чем у большинства красивые настольные принтеры, за исключением asciitable (теперь astropy.io.ascii, так что может быть немного излишним, если вы не ученый-ракетчик)

3
Serge 24 Апр 2017 в 17:20

Я сделал программу, которая открывает .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
ragardner 24 Апр 2017 в 14:08
43588288