【问题标题】:Turning a text file into a tabular format [duplicate]将文本文件转换为表格格式[重复]
【发布时间】:2019-04-07 20:06:26
【问题描述】:

我在尝试正确格式化文本文件以符合学校项目所需的标准时遇到问题。我已经坚持了一段时间,而且我对编码还是很陌生,想知道是否有人有我可以理解和实施的答案,希望我可以向更有经验的人学习。

我想转换一个用户可以输入的文本文件,在文件中看起来像这样:

Lennon 12 3.33
McCartney 57 7
Harrison 11 9.1
Starr 3 4.13

并创建它以适应如下表格格式:

Name            Hours      Total Pay
Lambert            34         357.00
Osborne            22         137.50
Giacometti          5         503.50 

我可以创建标题,虽然它可能不是漂亮的代码,但是当我打印测试文件的内容时,它通常会变成这样:

Name            Hour      Total pay
Lennon 12 3.33
McCartney 57 7
Harrison 11 9.1
Starr 3 4.13

而且我不明白如何正确格式化它,使其看起来像一个正确的表格,正确对齐并与实际标题正确一致,我不知道如何真正解决它,也不知道从哪里开始,因为我没有对此没有任何实际依据。

在尝试使用诸如 file_open.read().rstrip("\n).format 之类的东西弄乱索引并且有时以某种方式最终只出现单个字母之后,我已经将我的代码分解为骨架:

file_name = input("Enter the file name: ")

print("Name" + " " * 12 + "Hour" + " " * 6 + "Total pay")
with open(file_name, 'r') as f:

    for line in f:

        print(line, end='')

我知道它看起来很简单,因为它确实如此。我们的讲师希望我们使用“打开”命令,并尽量远离可能降低可读性但仍尽可能紧凑的东西。 这包括导入第三方工具,这些工具减少了使用诸如 beautifultable 之类的东西的机会,就像其他一些朋友提供的更简单的出路一样。

我有一个同学说要读取将其转换为列表的行并从那里进行一些格式调整,另一位同学说我可能可以不列出它来格式化它;虽然我发现换行符“\n”出现在每个列表索引的末尾如果把它变成一个列表

例如:['Lennon 12 3.33\n', 'McCartney 57 7\n', 'Harrison 11 9.1\n', 'Starr 3 4.13']

虽然我不明白如何格式化列表中的内容,以便名称可以与每个数字变量分开并与标题保持一致,因为我没有太多经验 for 循环可以在我的课堂上轻松解决,如果我有这种感觉的话。

我并不是在寻找直接编码的答案,而是在正确的方向上或在哪里阅读如何操作列出的内容

【问题讨论】:

  • 请发布您的代码以帮助我们。

标签: python string file datatable readline


【解决方案1】:

您可以为此使用 pandas,数据框将完成所需的工作

import pandas as pd
df = pd.read_csv('file.txt', sep='\s{1,}')
df.columns = ['Name','Hours','Total Pay']
print(df)

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这里有一些东西可以让你朝着正确的方向前进:

    data_filename = 'employees.txt'
    headers = 'Name', 'Hours', 'Rate'  # Column names.
    
    # Read the data from file into a list-of-lists table.
    with open(data_filename) as file:
        datatable = [line.split() for line in file.read().splitlines()]
    
    # Find the longest data value or header to be printed in each column.
    widths = [max(len(value) for value in col)
                for col in zip(*(datatable + [headers]))]
    
    # Print heading followed by the data in datatable.
    # (Uses '>' to right-justify the data in some columns.)
    format_spec = '{:{widths[0]}}  {:>{widths[1]}}  {:>{widths[2]}}'
    print(format_spec.format(*headers, widths=widths))
    for fields in datatable:
        print(format_spec.format(*fields, widths=widths))
    

    输出:

    Name       Hours  Rate
    Lennon        12  3.33
    McCartney     57     7
    Harrison      11   9.1
    Starr          3  4.13
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-15
      • 2019-06-20
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多