在 Python 中读取包含多个 space 作为分隔符的 txt 文件

Reading txt file with more than one space as a delimiter in Python

我有一个文本文件,其中 列被多个 space 分隔。问题是每一列的值也可以被分隔,但最多只有一个space。所以它可能看起来像这样

aaaxx   123 A   xyz   456 BB 
zcbb  a b   XYZ   xtz 1 
cdddtr  a  111  tddw

有什么方法可以阅读这样的table吗?我尝试了几种方法,我认为我必须使用某种正则表达式作为分隔符,但老实说我不知道​​如何解决这个问题。

您可能想使用正则表达式

import re

content = """aaaxx   123 A   xyz   456 BB 
zcbb  a b   XYZ   xtz 1 
cdddtr  a  111  tddw
"""

# Split the content on new lines
rows = content.split("\n")

# Create a 2D list (table) out of the values
table = []

for row in rows:
    row_arr = []
    # The "[ ]" is the regexp equivalent of "space" and {2,} means 2+
    for column in re.split("[ ]{2,}", row):
    # If the row is empty, don't add it to the table
    if len(row_arr):
        table.append(row_arr)

print(table)

其他解决方案,使用pandas

import pandas as pd

df = pd.read_csv("your_file.txt", sep=r"\s{2,}", engine="python", header=None)
print(df)

打印:

        0      1    2       3
0   aaaxx  123 A  xyz  456 BB
1    zcbb    a b  XYZ   xtz 1
2  cdddtr      a  111    tddw

这里有两个我会使用的实现。它们基于奇偶校验:由两个 space 分隔的值将由单个 space 分隔的值保持在一起,由偶数个 space 分隔的值被正确分割,并且使用 strip 方法清除不均匀的情况。过滤掉剩余的空字符串。

content = """aaaxx   123 A   xyz   456 BB 
zcbb  a b   XYZ   xtz 1 
cdddtr  a  111  tddw"""


def split_file_content(file_content: str) -> list[list[str]]:
    """If you don't like regex"""
    return [
        [part.strip() for part in row.split("  ") if part]
        for row in file_content.split("\n")
    ]


def split_file_content_loops(file_content: str) -> list[list[str]]:
    """If you don't like regex AND list comprehensions"""
    table = []
    for row in file_content.split("\n"):
        values = []
        for part in row.split("  "):
            if part:
                values.append(part.strip())
        table.append(values)
    return table


print(split_file_content(content))
print(split_file_content_loops(content))