【问题标题】:How can I align properly the words into a txt files?如何将单词正确对齐到 txt 文件中?
【发布时间】:2022-01-16 05:20:48
【问题描述】:

大家晚上好,我是 9 岁的 David tzu,我真的需要帮助解决这个单词正确对齐的问题,我只尝试了打印但不太适合。

sample.txt 包含:

David Tzu           January 13, 2012        FriedChicken
Mama                March 15, 1980          Sphagetti
Papa                June 27, 1981           Burger

这是我的代码:

file = open("sample.txt", "r")
line_count = 1
for line in file:
    if line != "\n":
        line_count += 1
file.close()


with open("sample.txt") as fi:
    print("")
    for x in range(1,line_count):
        print(x, fi.readline().replace("\n", ""))
    print("")

上面代码的当前结果是这样的:

 1   David Tzu           January 13, 2012        FriedChicken
 2   Mama                March 15, 1980          Sphagetti
 3   Papa                June 27, 1981           Burger

预期结果:

      Name                  Birthday               Favorite Food
 1   David Tzu           January 13, 2012          FriedChicken
 2   Mama                March 15, 1980            Sphagetti
 3   Papa                June 27, 1981             Burger

我真的很抱歉我糟糕的英语,希望你们都明白我想表达的意思。

附加代码: #字数

file = open("sample.txt", "r")
line_count = 1
for line in file:
    if line != "\n":
        line_count += 1
file.close()


with open("sample.txt") as fi:
    print("")
    for x in range(1,line_count):
        print(x, fi.readline().replace("\n", ""))
    print("")

file = open("Sample.txt", "rt")
data = file.readline()
words = data.split()

print(len(words))

【问题讨论】:

  • 查看字符串格式pyformat.info
  • 我不明白你的问题。您只需添加行Name Birthday Favorite Food
  • 我不明白你为什么打开文件两次——你应该使用for number, line in enumerate(fi, 1):,而且你不必计算行数。或者您应该在第一个 for-loop 中一次性完成所有操作。
  • 如果您不知道列的长度,那么首先您必须将每一行拆分为列,并为每一列使用len(),然后获取max(all_lengths_in_column) - 然后使用此值使用string formatting 格式化列。但问题是将行拆分为列 - 它可能需要正则表达式,它可以使用 \s{2,} 拆分 2 or more spaces
  • 嗨,大卫 - 在我们进一步讨论之前,我只想澄清一下您的目标。从您在上面发布的预期输出和实际结果来看,您所缺少的似乎只是列的标题?包括标题是你想要做的吗?

标签: python file alignment txt


【解决方案1】:

我不知道我是否理解你的问题。

在您的示例中,您似乎只需要添加具有正确空格数的第一行

print('    Name                Birthday                Favorite Food')

最小的工作示例。

我使用io只是为了模拟内存中的文件,所以每个人都可以简单地复制它并测试它。

text = '''David Tzu           January 13, 2012        FriedChicken
Mama                March 15, 1980          Sphagetti
Papa                June 27, 1981           Burger'''

import io

#fh = open("sample.txt")
fh = io.StringIO(text)

print('    Name                Birthday                Favorite Food')

line_count = 0

for line in fh:
    line = line.strip()
    if line:
        line_count += 1
        print(f"{line_count:3} {line}")        

结果:

    Name                Birthday                Favorite Food
  1 David Tzu           January 13, 2012        FriedChicken
  2 Mama                March 15, 1980          Sphagetti
  3 Papa                June 27, 1981           Burger

如果您的行数超过 999,那么您可能需要在 {line_count:3} 中使用更大的数字,并且在 Name 之前需要更多的空格

您必须仅使用fh = open()fh.write(line + '\n')fh.close() 而不是print() 才能将其保存在文件中。或者你可以打开使用print(..., file=fh) 而不是write()


如果您不知道列有多长,那么您可能需要读取所有行,拆分为列,然后为列中的每个值获取 len() 并为每一列获取 max(all_lenght_in_column) - 稍后您可以使用这个值与string formatting 一样{variable:lenght}。但它可能需要regex 来拆分2 or more spaces (\s{2,}) 上的列。所以这一切都要复杂得多。


最终你可以尝试使用pandasread_csv 与分隔符\s{2,}

text = '''David Tzu           January 13, 2012        FriedChicken
Mama                March 15, 1980          Sphagetti
Papa                June 27, 1981           Burger'''

import pandas as pd
import io

#fh = "sample.txt"
fh = io.StringIO(text)

df = pd.read_csv(fh, names=['Name', 'Birthday', 'Favorite Food'], sep='\s{2,}', index_col=False)

df.index += 1

print(df)

结果:

        Name          Birthday Favorite Food
1  David Tzu  January 13, 2012  FriedChicken
2       Mama    March 15, 1980     Sphagetti
3       Papa     June 27, 1981        Burger

您可以将其作为df.to_string() 并保存在普通文本文件中。

with open('output.txt', 'w') as fh:
    fh.write(df.to_string())

【讨论】:

    【解决方案2】:

    如果您知道文件中列之间的空间是制表符空间,则可以这样做。

    with open("sample.txt") as ftr:        
        line_number = 1    
        print("\tName \tBirthday \tFavorite food")
        for line in ftr.readlines():
            print("%s \t%s" % (line_number, line))
            line_number += 1
    

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多