Как выровнять текст в выводе в файл - PullRequest
0 голосов
/ 19 февраля 2019

Я нахожу множество решений о том, как печатать во многих стилях / форматах и ​​т. Д., Но мне нужно знать, как сделать их внутри файла.

У меня есть код ниже ...

import glob
import getpass
user = getpass.getuser()

import time

timestr = time.strftime("%Y%m%d-%H%M%S")
read_files = glob.glob("myOrders/*.txt")

with open("myOrderCopies/" +user+ "_" +timestr+ "_Hard_Drive_Order.txt", "wb") as outfile:
    for f in read_files:
        with open(f, "rb") as infile:
            outfile.write(infile.read())

# Read .txt file and putlines row_name and Product ID into new .txt file
searchquery = 'row_name', 'Product ID'

#source file
with open("myOrderCopies/" +user+ "_" +timestr+ "_Hard_Drive_Order.txt") as f1:
    #output file
    with open("hwOrderCopies/" +user+ "_" +timestr+ "_HardDriveSummary.txt", "wt") as f2:
        lines = f1.readlines()
        for i, line in enumerate(lines):
            if line.startswith(searchquery):
                f2.write("\n" + line)
                #f2.write(lines[i + 1])
                #f2.write(lines[i + 2])

#count how many occurances of 'Product ID'
import os

#def main():
with open("hwOrderCopies/" +user+ "_" +timestr+ "_HardDriveSummary.txt", "a+") as f:
    term = "Product ID"
    count = f.read().count(term)
    f.seek(os.SEEK_END)  # Because we've already read the entire file. Go to the end before writing otherwise we get an IOError
    f.write("\nTotal Number of Hard Drives: "+str(count)+ "\n\n")

, который работает, чтобы получить то, что я хочу в файле.Проблема с выравниванием (ниже).Как я могу получить результаты для выравнивания row_name справа?

row_name        California Datacenter

Product ID                      : ST3600057SS

Product ID                      : ST3600057SS

Total Number of Hard Drives: 2

1 Ответ

0 голосов
/ 19 февраля 2019

Используя список, чтобы проиллюстрировать использование format() для выравнивания элемента, способ решения вашей проблемы следующий:

row_item = ['row_name', 'California Datacenter']
output = '{}{:>40}'.format(row_item[0], row_item[1])

print(output)

Вывод:

row_name                   California Datacenter

Вхождения «{}» представляют одну переменную в примере format(variable_1, variable_2).

Синтаксис внутри второго элемента ({:>40}) представляет выравнивание по правому краю, используя :>.:< будет выравнивание по левому краю.40 обозначает, что ширина поля вывода будет дополнена до 40 символов.

Вот несколько оптимизированная версия вашего кода, которая должна привести к желаемому выводу, переменные переименованы, чтобы быть более читабельными (всегдахорошая привычка к рассмотрению), а форматирование доступно как переменная.Как уже упоминалось, число в строке formatting определяет ширину заполнения.Регулировка, которая переместит колонки ближе или дальше.Обратите внимание, что я взял на себя смелость форматировать строки Product ID, а также row_name.

Я также абстрагировал ваши имена файлов в переменные, для удобства чтения, и переместил второй наборвложенные with open() операторы в составные with менеджеры контекста, так как они не изменяются в цикле.

import glob
import os
import time
import getpass

user = getpass.getuser()

timestr = time.strftime("%Y%m%d-%H%M%S")
read_files = glob.glob("myOrders/*.txt")
myOrderCopies_file = "myOrderCopies/" + user + "_" + timestr + "_Hard_Drive_Order.txt"
hwOrderCopies_file = "hwOrderCopies/" + user + "_" + timestr + "_HardDriveSummary.txt"

searchquery = 'row_name', 'Product ID'
term = "Product ID"

formatting = '{:<40}{:>}\n\n'

# Read .txt files and put lines 'row_name' and 'Product ID' into new .txt file
with open(myOrderCopies_file, "wb") as myOrderCopies:
    for file_name in read_files:
        with open(file_name, "rb") as infile:
            myOrderCopies.write(infile.read())

with open(myOrderCopies_file, 'rb') as myOrderCopies, open(hwOrderCopies_file, "w") as hwOrderCopies:
    term_counter = 0
    lines = myOrderCopies.readlines()
    for line in lines:
        if line.startswith(searchquery):
            if "row_name" in line:
                split_line = line.split('        ')
            else:
                if term in line:
                    term_counter += 1
                split_line = line.split('                      : ')
            hwOrderCopies.write(formatting.format(split_line[0], split_line[1]))
    hwOrderCopies.write("\nTotal Number of Hard Drives: {}\n\n".format(str(term_counter)))
...