【问题标题】:How to remove substring from string in Python 3如何在 Python 3 中从字符串中删除子字符串
【发布时间】:2019-09-12 01:17:54
【问题描述】:

我是 Python 3 的新手。目前,我正在做一个需要 ne 遍历 csv 文件(不使用 csv 模块)并提取数字的项目。虽然我已经能够完成大部分提取部分,但我的问题是每行的最后一个数字都印有"\n,",这意味着我无法将其转换为浮点数。我怎样才能摆脱每一行的这种情况?

我尝试过使用.rsplit("\n").replace("\n", " ").replace("\\n", " "),甚至在两个单独的替换语句中都使用了反斜杠和 n,但它们仍然存在。

这是我目前拥有的:

for row in open(filename):
    row = row.split(",") # elements separated by commas
    for i in range(len(row) - 1): # go through each element in the row
        row[i].replace("\\n", " ") # supposed to get rid of the \n at the end
        row[i] = float(row[i]) # str to float conversion
    lines.append(row) # add that row to list of lines

示例 csv:13.9, 5.2, 3.4

预期结果:[13.9, 5.2, 3.4]

实际结果:[13.9, 5.2,'3.4\n']

抱歉,如果我格式错误,这是我第一次在 Stack Overflow 上发帖。感谢您的帮助,谢谢!

【问题讨论】:

  • 检查我的新答案:我忽略了一个关键问题。

标签: python python-3.x string


【解决方案1】:

当前代码问题

replace 无法就地工作。相反,它返回一个替换完成的字符串。因此,对于修复#1,您应该将您的声明从:

row[i].replace("\\n", " ")

到:

row[i] = row[i].replace("\\n", " ")

然而,更大的问题是对从.split(",") 操作获得的列表进行迭代。

事实上,您的迭代缺少 1 个元素,因此永远不会触及最后一项,因此永远不会删除 \n。让我们做一些数学运算:

row = ['13.9', ' 5.2', ' 3.4\n']
# len(row)  == 3
# len(row) - 1 == 2
# range(len(row) - 1) == [0 1], which will do 2 iterations instead of 3

因此,修复 #2 将纠正 for 循环,它应该看起来像:

for row in open(filename):
    row = row.split(",")
    for i in range(len(row)):  # notice the absence of -1
        row[i] = row[i].replace("\n", "")
        row[i] = float(row[i])
    lines.append(row)

更好的方法

由于 CSV 文件的每一行都有一个结尾 \n,您最好在拆分列并通过映射将 str 转换为 float 之前将其剥离 ,例如这个:

lines = []
for row in open(filename):
    row = row.strip().split(",")  # first remove the "\n" then split
    row = list(map(float, row))   # [13.9, 5.2, 3.4]
    lines.append(row)

【讨论】:

  • 我真的希望这会奏效,但不幸的是它仍然在最后打印“\n”。谢谢你的尝试!
  • @user12055762 检查我的更新答案:我忽略了您原始代码中的一个关键问题。
【解决方案2】:

字符串在 Python 中是不可变的,因此您需要始终将 row[i] 分配回其自身的修改版本:

for row in open(filename):
    row = row.split(",")
    for i in range(len(row) - 1):
        row[i] = row[i].replace("\n", "")  # CHANGE HERE
        row[i] = float(row[i])
    lines.append(row)

注意:使用常规字符串替换时,您不需要对\n 中的反斜杠进行双重转义。

【讨论】:

  • 最好使用.strip(),因为我们不需要空格,因为字符串正在转换为浮点数
  • 我刚刚尝试了这个和.strip(),但它仍然打印每行的最后一个元素,并在末尾带有'\n'。非常感谢您的建议。
  • 请尝试:row[i] = row[i].replace("\n", "") ...不要用空格替换,用空字符串替换。
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多