遍历 python 数组不起作用
Iterating through a python array does not work
以下代码吐出以下内容:
...
6
)
,
(
'
1
9
2
.
1
6
8
.
0
.
5
9
'
,
6
0
7
1
,
'
1
9
2
.
1
6
8
.
0
.
1
9
9
'
,
0
,
6
)
]
代码:
f=open("example.txt", "r")
list=f.read()
for i in list:
print(i)
example.txt: https://pastebin.com/uN5wVZKL
example.txt 如下所示:[(IP,number,IP,number,number),(IP,number,IP,number,number),(IP,number,IP,number,number),...]
我以为我可以遍历该数组以获取数组中每个元组中的第一个 IP,但它只是逐个字符而不是逐个元素来迭代字符。
我做错了什么?
此问题已得到解答。这是最终产品:https://pastebin.com/TaVKDVfU
python 中的 print 函数有一个 'end' 参数,默认为换行符 \n
。
由于每个字符都是单独读入的,因此 i
是一个字符后跟 \n
尝试print(i, end = '')
你想打印什么?每个元组或每个 IP?仅供参考,它不是 Python 中的数组,它是一个列表。
我刚刚完成了这个。
data = [('192.168.0.59', 2881, '192.168.0.199', 0, 6), ('192.168.0.199', 0, '192.168.0.59', 0, 1), ('192.168.0.59', 2882, '192.168.0.199', 0, 6)]
for item in data:
print(data)
并得到以下内容:
('192.168.0.59', 2979, '192.168.0.199', 0, 6)
('192.168.0.59', 2980, '192.168.0.199', 0, 6)
('192.168.0.59', 2981, '192.168.0.199', 0, 6)
('192.168.0.59', 2982, '192.168.0.199', 0, 6)
('192.168.0.59', 2983, '192.168.0.199', 0, 6)
但是我和你一样做了,得到了一样的结果:
with open("data.txt", "r") as f:
data = f.read()
for item in data:
print(item)
但是如果您要执行类似 print(type(data))
的操作,它会告诉您这是一个字符串。所以这就是为什么你得到你得到的东西。因为您正在迭代该字符串中的每个项目。
with open("data.txt", "r") as f:
data = f.read()
new_list = data.strip("][").split(", ")
print(type(data)) # str
print(type(new_list)) # list
因此,您可以 split()
字符串,它会让您回到您的列表。像上面一样...说过我已经测试了拆分选项,但我认为它不会给你想要的结果。像这样使用 ast
时效果更好:
import ast
with open("data.txt", "r") as f:
data = f.read()
new_list = ast.literal_eval(data)
for item in new_list:
print(item)
这会打印出如下内容:
('192.168.0.59', 6069, '192.168.0.199', 0, 6)
('192.168.0.59', 6070, '192.168.0.199', 0, 6)
('192.168.0.59', 6071, '192.168.0.199', 0, 6)
更新
获取第一个IP
import ast
with open("data.txt", "r") as f:
data = f.read()
new_list = ast.literal_eval(data)
for item in new_list:
print(item[0])
f.read() return 你的文本文件的内容是一个字符串,你不能把它转换成一个元组列表。
好吧,你可以使用很多 split() (我建议在“)”或“(”上拆分每个元组,然后在“,”上拆分以获得元组的每个元素)。类似于:
with open("example.txt", "r") as f:
your_list: list[tuples]
# read the file as a string
f_in_str: str = f.read()
# removing useless characters
f_in_str = f_in_str.replace("[", "")
f_in_str = f_in_str.replace("]", "")
f_in_str = f_in_str.replace("(", "")
f_in_str = f_in_str.replace(" ", "")
f_in_str = f_in_str.replace("'", "")
# split it into a list
tuples_in_str: list[str] = f_in_str.split("),")
# convert str to tuples
for tuple_str in tuples_in_str:
# split() returns a list that we convert into a tuple
a_tuple: tuple = tuple(tuple_str.split(","))
your_list.append(a_tuple)
请注意,我尚未测试该代码。
如果可以的话,我强烈建议您将源格式更改为 csv 之类的格式。这会让以后的事情变得容易很多。
以下代码吐出以下内容:
...
6
)
,
(
'
1
9
2
.
1
6
8
.
0
.
5
9
'
,
6
0
7
1
,
'
1
9
2
.
1
6
8
.
0
.
1
9
9
'
,
0
,
6
)
]
代码:
f=open("example.txt", "r")
list=f.read()
for i in list:
print(i)
example.txt: https://pastebin.com/uN5wVZKL
example.txt 如下所示:[(IP,number,IP,number,number),(IP,number,IP,number,number),(IP,number,IP,number,number),...]
我以为我可以遍历该数组以获取数组中每个元组中的第一个 IP,但它只是逐个字符而不是逐个元素来迭代字符。
我做错了什么?
此问题已得到解答。这是最终产品:https://pastebin.com/TaVKDVfU
python 中的 print 函数有一个 'end' 参数,默认为换行符 \n
。
由于每个字符都是单独读入的,因此 i
是一个字符后跟 \n
尝试print(i, end = '')
你想打印什么?每个元组或每个 IP?仅供参考,它不是 Python 中的数组,它是一个列表。
我刚刚完成了这个。
data = [('192.168.0.59', 2881, '192.168.0.199', 0, 6), ('192.168.0.199', 0, '192.168.0.59', 0, 1), ('192.168.0.59', 2882, '192.168.0.199', 0, 6)]
for item in data:
print(data)
并得到以下内容:
('192.168.0.59', 2979, '192.168.0.199', 0, 6)
('192.168.0.59', 2980, '192.168.0.199', 0, 6)
('192.168.0.59', 2981, '192.168.0.199', 0, 6)
('192.168.0.59', 2982, '192.168.0.199', 0, 6)
('192.168.0.59', 2983, '192.168.0.199', 0, 6)
但是我和你一样做了,得到了一样的结果:
with open("data.txt", "r") as f:
data = f.read()
for item in data:
print(item)
但是如果您要执行类似 print(type(data))
的操作,它会告诉您这是一个字符串。所以这就是为什么你得到你得到的东西。因为您正在迭代该字符串中的每个项目。
with open("data.txt", "r") as f:
data = f.read()
new_list = data.strip("][").split(", ")
print(type(data)) # str
print(type(new_list)) # list
因此,您可以 split()
字符串,它会让您回到您的列表。像上面一样...说过我已经测试了拆分选项,但我认为它不会给你想要的结果。像这样使用 ast
时效果更好:
import ast
with open("data.txt", "r") as f:
data = f.read()
new_list = ast.literal_eval(data)
for item in new_list:
print(item)
这会打印出如下内容:
('192.168.0.59', 6069, '192.168.0.199', 0, 6)
('192.168.0.59', 6070, '192.168.0.199', 0, 6)
('192.168.0.59', 6071, '192.168.0.199', 0, 6)
更新
获取第一个IP
import ast
with open("data.txt", "r") as f:
data = f.read()
new_list = ast.literal_eval(data)
for item in new_list:
print(item[0])
f.read() return 你的文本文件的内容是一个字符串,你不能把它转换成一个元组列表。 好吧,你可以使用很多 split() (我建议在“)”或“(”上拆分每个元组,然后在“,”上拆分以获得元组的每个元素)。类似于:
with open("example.txt", "r") as f:
your_list: list[tuples]
# read the file as a string
f_in_str: str = f.read()
# removing useless characters
f_in_str = f_in_str.replace("[", "")
f_in_str = f_in_str.replace("]", "")
f_in_str = f_in_str.replace("(", "")
f_in_str = f_in_str.replace(" ", "")
f_in_str = f_in_str.replace("'", "")
# split it into a list
tuples_in_str: list[str] = f_in_str.split("),")
# convert str to tuples
for tuple_str in tuples_in_str:
# split() returns a list that we convert into a tuple
a_tuple: tuple = tuple(tuple_str.split(","))
your_list.append(a_tuple)
请注意,我尚未测试该代码。
如果可以的话,我强烈建议您将源格式更改为 csv 之类的格式。这会让以后的事情变得容易很多。