【问题标题】:Why does Python add newline characters to some list elements?为什么 Python 会在某些列表元素中添加换行符?
【发布时间】:2019-05-31 16:40:14
【问题描述】:

我正在从名为 WeaponShack.list 的文本文件中读取文件

这些是'weapon shack.list'的内容:

Grenade
Ak-47
Shotgun
Makarov
Minigun
Bat
Katana
Chainsaw
Flamethrower

没有空格。这些项目按原样复制粘贴。

我尝试删除一些换行符,但是当我打印列表时,“\n”字符只是不断出现在某些元素上。我不明白为什么。

我尝试使用 .strip('\n') 但“\n”字符仍会在末尾弹出 一些元素。

print("Taking weapons from Weapon shack")
weapons = []
with open("WeaponShack.list",'r') as ws:
    weapons = ws.readlines()
    for weapon in weapons:
        weapons.remove(weapon)
        weapon = weapon.strip('\n')
        weapons.append(weapon)
ws.close()
print(weapons)

预期的输出是:

从武器小屋拿武器 ['Ak-47'、'Makarov'、'蝙蝠'、'电锯'、'手榴弹'、'Minigun'、'Flamethrower'、'Katana'、'Shotgun']

但实际输出是:

从武器小屋拿武器 ['Ak-47\n', 'Makarov\n', '蝙蝠\n', '电锯\n', '手榴弹', 'Minigun', 'Flamethrower', 'Katana', 'Shotgun']

有人知道为什么会这样吗?

编辑 我的重点是为什么会出现“\n”字符。不是如何遍历列表。 也在尝试这个建议:adding a new list:

print("Taking weapons from Weapon shack")
weapons = []
newWeaponList = []
with open("WeaponShack.list",'r') as ws:
    weapons = ws.readlines()
    for weapon in weapons:
        weapons.remove(weapon)
        weapon = weapon.strip('\n')
        newWeaponList.append(weapon)
ws.close()
print(newWeaponList)

产生这个输出:

从武器小屋拿武器 ['手榴弹','霰弹枪','迷你枪','武士刀','火焰喷射器']

很奇怪,因为它没有显示所有元素。

【问题讨论】:

  • 因为您在迭代列表时正在修改列表。而是创建一个新列表。
  • 这样做会导致“\n”字符出现吗?如果是的话?为什么会这样?
  • 在迭代列表时从列表中删除内容会混淆列表中元素的相对顺序。由于您只对列表进行一次迭代,因此可能会跳过某些元素。所以\n 没有出现 - 它只是从未从某些元素中删除。

标签: python io


【解决方案1】:

这是因为您正在阅读和修改列表以防止遍历每个元素。 weapon.strip('\n')

永远无法到达末尾带有“\n”的武器

为了让它更干净,消除遍历问题并摆脱新的空间,试试这样的answer:

print("Taking weapons from Weapon shack")
with open("weapons.list") as ws:
    readWeapons = ws.readlines()
    for weapon in readWeapons:
        weapon = weapon.rstrip('\n')
        weapons.append(weapon)
print(weapons)

编辑:

要回答您的说明,这是因为 python 中的 for 循环是如何工作的。我不知道确切的细节,但似乎 for 循环实际上是实时访问数组,而不是一次读取整个数组。从 test.list 中查看此读数,其中包含对应于 A-D 的四行:

print("Taking item from test\n")
with open("test.list",'r') as ws:
    elements = ws.readlines()
    print(elements)
    print()
    for element in elements:
        print('Current element: ' + element)
        elements.remove(element)
        print('Element pre-strip: ' + str(elements))
        element = element.strip('\n')
        print('Stripped element: ' + element)
        elements.append(element)
        print('Element list post-strip: ' + str(elements))

输出:

Taking item from test

['A\n', 'B\n', 'C\n', 'D\n']

Current element: A

Element pre-strip: ['B\n', 'C\n', 'D\n']
Stripped element: A
Element list post-strip: ['B\n', 'C\n', 'D\n', 'A']
Current element: C

Element pre-strip: ['B\n', 'D\n', 'A']
Stripped element: C
Element list post-strip: ['B\n', 'D\n', 'A', 'C']
Current element: A
Element pre-strip: ['B\n', 'D\n', 'C']
Stripped element: A
Element list post-strip: ['B\n', 'D\n', 'C', 'A']
Current element: A
Element pre-strip: ['B\n', 'D\n', 'C']
Stripped element: A
Element list post-strip: ['B\n', 'D\n', 'C', 'A']

由于追加而不是前置,当 for 循环从数组的索引 a 移动到数组的索引 a + 1 时,每个其他元素都被跳过。这会导致 B 和 D(索引 1 和 3)被跳过,而 A 被读取 3 次。

【讨论】:

    【解决方案2】:

    @rdas 谢谢你的帮助。

    " 在迭代列表时从列表中删除内容会混淆列表中元素的相对顺序。由于您只对列表进行一次迭代,因此可能会跳过某些元素。所以 \n 没有出现 - 它只是从未从某些元素中删除。”

    我删除了 weapons.remove(weapon) 行并修复了它!

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多