在一行中找到第 n 个出现的字符并将其替换在 Python 中,以便 fix/replace 一个 wrong/leftover ";"文本文件中的分隔符

Find nth occurrence of a character in a row and replace it in Python, in order to fix/replace a wrong/leftover ";" separator in a text file

我想导入一个 文本文件,有 14 列,符号为“;”作为列分隔符。所以,如果我们有 14 列,这意味着我们会找到 13 个“;”每个 line/row.

中的分隔符

问题是,如下图,有一行,有一个“;”其中一列内的字符。 这行有14个“;”分隔符(转换为 15 列)。

如果我们打开 Excel 中的文件,我们可以在那里看到这个错误的“额外”列:

尝试使用 "read_csv" pandas 函数读取此文件,它 引发错误,提示您有 15 列(而不是 14)。

因此,在使用 read_csv 函数之前 我想打开文件,找到带有 14 个“;”的行行中的分隔符,modify/replace 第 13 次出现“;”带有“.”的符号并写回另一个文本文件。

由于字符串在 Python 中是不可变的,理论上,我不知道 如何继续我的 Python 脚本。 怀疑解决方案在列表中附加或粘贴文本。 顺便说一句,这段代码将成为最终脚本的一部分,因为以后这个问题会发生更多次。

# Creating an empty list to store all the lines from the file will be readed.
listoflines = []

# Opening the file.txt in only "reading" model
with open(r"D:\file.txt", mode='r') as reader:
    for line in reader.readlines():
        listoflines.append(line)

# Creating an empty list to store all the lines including the modified lines.
finaldocument = []
# Detecting the row(s) where the count of the ";" symbol is equal to 14.
for row in listoflines:
    if row.count(';') == 14:
        # Creating a counter.
        n=0
        # Iterating over the letters of the row
        for letter in row:
            if letter == ';':
                n+=1
                # We need to detect the 13rd ";" symbol of the row.
                if n==13:
                    print(letter)
                    letter = letter.replace(';','.')
                    print(letter)
                    
    ## HOW TO APPEND/REPLACE THE MODIFIED LETTER TO THE ROW???? ##
      
    # Storing, again, all the lines (including modified lines) to a final object.
    finaldocument.append(row)

print(finaldocument)

而不是这样做:

if row.count(';') == 14:
    # Creating a counter.
    n=0
    # Iterating over the letters of the row
    for letter in row:
        if letter == ';':
            n+=1
            # We need to detect the 13rd ";" symbol of the row.
            if n==13:
                print(letter)
                letter = letter.replace(';','.')
                print(letter)

这样做:row = row.split(";") 这会将行转换为列表,如果您只需要 len 14,您可以添加:row = row[:14]

您不应将 semi-colon 替换为另一个字符,而应将字符串用双引号引起来(并通过加倍转义任何可能已经是字符串一部分的双引号)。这就是在 CSV 语法中可以包含此类分隔符的方式。事实上,将此类文本始终用双引号括起来并不是坏习惯。

以下是我调整循环的方式:

for row in listoflines:
    if row.count(';') > 13:  # maybe there are even two or more of them
        cells = row.split(';')
        # Escape double quotes and wrap in double quotes
        s = '"' + ';'.join(cells[12:-1]).replace('"', '""') + '"'
        # Replace the involved parts with that single part
        cells[12:-1] = [s]
        # ...and convert back to the string format
        row = ';'.join(cells)
      
    finaldocument.append(row)