在一行中找到第 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)
我想导入一个 文本文件,有 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)