【问题标题】:Python - Getting TypeError with _io.BufferedReaderPython - 使用 _io.BufferedReader 获取 TypeError
【发布时间】:2020-11-19 07:50:41
【问题描述】:

我正在尝试实施 Prim 算法,但不断收到此错误,我不知道该怎么办。这两个文件都是 .txt 文件,第一个(分配给 matrizA 的那个)包含一个邻接矩阵,而第二个是一个顶点名称列表,每行一个。

import networkx as nx

def peso(matrizA, u,v):
    return matrizA[u][v]

def adjac(matrizA, u):
    L = []
    for x in range(len(matrizA)):
        L.insert(0,x)
    return L

def extraiMin(Q):
    q = Q[0]
    Q.remove(Q[0])
    return q

def decKey(Q, K):
    for i in range(len(Q)):
        for j in range(len(Q)):
            if K[Q[i]]< K[Q[j]]:
                s = Q[i]
                Q[i] = Q[j]
                Q[j] = s

def prim(vList, matrizA, r):
    u = 0
    v = 0
    P = [None]*len(vList)
    K = [999999999]*len(vList)

    Q=[0]*len(V)
    for u in range(len(Q)):
        Q[u] = vList[u]

    K[r] = 0
    decKey(Q, K)
    while len(Q) > 0:
        u = extraiMin(Q)   
        Adj = adjac(matrizA, u)
        for v in Adj:
            w = peso(matrizA, u)

            if Q.count(v) > 0 and w < K[v]:
                P[v] = u
                K[v] = w
                decKey(Q, K)
    return P

matrizA = open("C:\TrabalhoGrafos\Prim\MatrizAdjacencia_Pesos.txt", 'rb')
V = open("C:\TrabalhoGrafos\Prim\AirportList_Vertices.txt", 'rb')

P = prim(V, matrizA, 0)
print (P)

PyCharm 显示的错误是这样的:

Traceback(最近一次通话最后一次):

文件“C:/TrabalhoGrafos/Prim/Prim.py”,第 74 行,在

P = prim(V, matrizA, 0)

文件“C:/TrabalhoGrafos/Prim/Prim.py”,第 40 行,在 prim 中

P = [无]*len(vList)

TypeError: '_io.BufferedReader' 类型的对象没有 len()

我保留了其他功能

【问题讨论】:

  • 你刚刚用V = open("C:\TrabalhoGrafos\Prim\AirportList_Vertices.txt", 'rb')打开了文件。而def prim(vList, matrizA, r) 需要一个列表。这是错误的,因为您将文件对象传递给 prim()。您应该将这些行作为列表读取并将其传递给 prim()....

标签: python python-3.x


【解决方案1】:

您刚刚使用V = open("C:\TrabalhoGrafos\Prim\AirportList_Vertices.txt", 'rb') 打开了文件。
def prim(vList, matrizA, r) 需要一个列表。
这是错误的,因为您将文件对象作为vList 传递给prim()
文件对象没有名为len()的方法:https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects

您应该将这些行作为列表读取并将其传递给prim()
现在您刚刚打开文件,您还没有阅读内容

你可以有类似的东西:

vList_file = "C:\TrabalhoGrafos\Prim\AirportList_Vertices.txt"
with open(vList_file, "rt") as in_file:
    V = in_file.readlines()
V = [x.strip() for x in V]  # strip '\n' from each element
P = prim(V, matrizA, 0) 
...

小心,matrizA 也是如此。在这种情况下,您也只是传递了一个您打开的文件对象,因此当for x in range(len(matrizA)):def adjac(matrizA, u) 中执行时,您会遇到类似的错误。

还请记住,您有 文本文件(看起来像),因此您不应以字节模式打开文件(即使用参数 'rb')。
更多内容
https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files


2020 年 11 月 19 日的微小更新/发现: 在 GitHub 上发现了一个比此答案晚两年多的问题,其中出现了相同的错误,并且在那里找到的解决方案与此答案中的一般建议相匹配(粗体)。

这个问题可以在这里阅读,因为它是公开的:

https://github.com/ping/instagram_private_api/issues/213

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-16
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多