簡體   English   中英

為什么 read().split("\n") 會導致錯誤,即使它從列表中刪除了 "\n" 不像 readlines() 和 readlines() 工作

[英]why does read().split("\n") result in an error even though it removes the "\n" from the list unlike readlines() and readlines() works

File1 包含以下整數:

3
6
5
8
33
12
7
4
72
2
42
13

File2 包含以下整數:

3
6
13
5
7
89
12
3
33
34
1
344
42

read()split("n") 出錯

    Traceback (most recent call last):
      File "main.py", line 12, in <module>
        result = [int(number) for number in list1 if number in list2]
      File "main.py", line 12, in <listcomp>
        result = [int(number) for number in list1 if number in list2]
    ValueError: invalid literal for int() with base 10: ''

Output for: 問題:為什么這段代碼可以工作,而其他代碼不能工作? 我想我必須從 list1 和 list2 中新創建的字符串中刪除“\n”,然后才能使用列表理解將其轉換為 integer,這就是我嘗試 read().split("\n" 的原因) 代碼部分首先刪除轉義字符。 代碼的 readlines() 部分能夠轉換包含“\n”的字符串沒有問題。 這是因為在使用 int() 轉義字符時會被忽略嗎?


    with open("file1.txt","r") as file1:
          #list1 = file1.readlines()
    with open("file2.txt","r") as file2:
          list2 = file2.readlines()

['3\n', '6\n', '5\n', '8\n', '33\n', '12\n', '7\n', '4\n', '72\n', '2\n', '42\n', '13\n']

['3\n', '6\n', '13\n', '5\n', '7\n', '89\n', '12\n', '3\n', '33\n', '34\n', '1\n', '344\n', '42\n']

[3, 6, 5, 33, 12, 7, 42, 13]

Python:

with open("file1.txt","r") as file1:
    list1 = file1.read().split("\n")
with open("file2.txt","r") as file2:
    list2 = file2.read().split("\n")

# with open("file1.txt","r") as file1:
      #list1 = file1.readlines()

# with open("file2.txt","r") as file2:
      #list2 = file2.readlines()

result = [int(number) for number in list1 if number in list2]

print(result)

有點不清楚你在問什么,但我會盡力回答為什么這兩行不等價以及為什么第二行會導致ValueError

  • file1.readlines()
  • file1.read().split("\n")

file1.readlines()

這個很簡單。 readlines方法只是將文件轉換為字符串列表。 文件中的一行對應於列表中的一項。 文件中有 12 行,因此您會得到一個包含 12 個字符串的列表。

with open("file1.txt", "r") as file1:
    print(file1.readlines())

# ['3', '6', '5', '8', '33', '12', '7', '4', '72', '2', '42', '13']

file1.read().split("\n")

在這種情況下, read方法將整個文件作為字符串返回。 這還包括您在原始帖子中提到的換行符。

with open("file1.txt", "r") as file1:
    file1.read()

# '3\n6\n5\n8\n33\n12\n7\n4\n72\n2\n42\n13\n'

現在,當您對字符串使用split方法時,它 Python 在分隔符的實例處拆分字符串並返回字符串的所有片段。 例如,如果我說"123".split("2")那么我可以期望['1', '3']被返回。 但是,當指定的分隔符位於字符串的末尾時,會發生什么不太直觀。 如果我說"123".split("3")那么我可以期待['12', ''] 因此,如果分隔符位於字符串的末尾或開頭, split將在列表的末尾或開頭返回一個空字符串。

file1的情況下,字符串末尾有一個\n分隔符,因此在拆分時您可以期待這樣的內容:

with open("file1.txt", "r") as file1:
    file1.read().split('\n')

# ['3', '6', '5', '8', '33', '12', '7', '4', '72', '2', '42', '13', '']

因此,當您嘗試將列表中的最后一項 ( '' ) 轉換為int時,您會得到ValueError: invalid literal for int() with base 10: ''

獎勵:file1.read().splitlines()

另一種選擇是splitlines方法,它將在換行符處拆分,但刪除任何前導或尾隨空格。

with open("file1.txt", "r") as file1:
    file1.read().splitlines()

# ['3', '6', '5', '8', '33', '12', '7', '4', '72', '2', '42', '13']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM