【问题标题】:Python trouble exiting a 'while' loop for simple scriptPython 在退出简单脚本的“while”循环时遇到问题
【发布时间】:2012-07-06 09:20:32
【问题描述】:

我编写了一个脚本,将制表符分隔的矩阵(带标题)重新格式化为“长格式”。请参见下面的示例。它正确执行了任务,但似乎陷入了无限循环......

输入示例:

WHO   THING1    THING2
me    me1       me2
you   you1      you2

期望的输出:

me    THING1    me1
me    THING2    me2
you   THING1    you1
you   THING2    you2

代码如下:

import csv
matrix_file = open('path')
matrix_reader = csv.reader(matrix_file, delimiter="\t")


j = 1
while j:
    matrix_file.seek(0)
    rownum = 0
    for i in matrix_reader:
        rownum+=1
        if j == int(len(i)):
            j = False
        elif rownum ==1:
            header = i[j]
        else:
           print i[0], "\t",header, "\t",i[j]
    j +=1

我认为这与我的退出命令有关 (j = False)。有任何想法吗?

编辑:感谢您的建议。我认为我最初发布的错误导致了一些混乱,对此感到抱歉现在我采用了一个简单的解决方案:

valid = True
while valid:
matrix_file.seek(0)
rownum = 0
for i in matrix_reader:
    rownum+=1
    if j == int(len(i)):
        valid = False

    etc, etc, etc...

【问题讨论】:

    标签: python list csv matrix reformat


    【解决方案1】:

    您的j += 1while 循环之外,因此j 永远不会增加。如果len(i) 永远不会小于 2,那么您将有一个无限循环。

    但正如我们所观察到的,这段代码还有其他问题。这是基于您的习语的工作版本。我会做很多不同的事情,但也许你会发现看看你的代码是如何工作的很有用可能

    j = 1
    while j:
        matrix_file.seek(0)
        rownum = 0
        for i in matrix_reader:
            rownum += 1
            if j == len(i) or j == -1:
                j = -1
            elif rownum == 1:
                header = i[j]
            else:
               print i[0], "\t", header, "\t", i[j]
        j += 1
    

    它不会按您想要的顺序打印行,但它会正确处理基础知识。

    我会这样做。我看到这与 Ashwini Chaudhary 发布的内容相似,但更笼统:

    import csv
    matrix_file = open('path')
    matrix_reader = csv.reader(matrix_file, delimiter="\t")
    
    headers = next(matrix_reader, '')
    for row in matrix_reader:
        for header, value in zip(headers[1:], row[1:]):
            print row[0], header, value
    

    【讨论】:

    • 您是否通过此修复获得了预期的输出?
    • 抱歉,我发布的代码有误,已更正。 “j+=1”是缩进的。但是,我认为错误是由于将数据类型与“j”混合为 Boolean 和 int。
    • @alexhli,请参阅我对您的代码版本的编辑,该版本几乎可以按预期工作。您可能会发现思考为什么我所做的更改是必要的很有用。
    【解决方案2】:

    j+=1 正如 senderle 的回答所说,在 while 循环之外。

    其他改进可以是:

    1. int(len(i)) ,只需使用 len(i) ,因为 len() 总是返回一个 int 所以不需要 int()
    2. 使用for rownum,i in enumerate(matrix_reader): 所以现在没有 需要处理一个额外的变量rownum,它将增加 本身。

    编辑:您的代码的工作版本,我认为这里不需要whilefor 循环就足够了。

    import csv
    matrix_file = open('data1.csv')
    matrix_reader = csv.reader(matrix_file, delimiter="\t")
    header=matrix_reader.next()[0].split() #now header is ['WHO', 'THING1', 'THING2']
    
    for i in matrix_reader:
            line=i[0].split()
            print line[0], "\t",header[1], "\t",line[1]
            print line[0], "\t",header[2], "\t",line[2]
    

    【讨论】:

    • 您是否通过此修复获得了预期的输出?
    • 我不这么认为,虽然你和@senderle 对j+= 1 的看法是正确的,但这不是(唯一的)问题......
    • 关于第 1 点:如果我使用该代码,我会收到错误消息,因为该点没有定义“i”。第 2 点有效,我不知道第 3 点,谢谢
    • @alexhli 第 1 点是错误的 :( ,关于第 3 点,enumerate() 返回两个值(索引和项目),所以您使用 rownum 来查看您在哪一行(a一种计数器),因此使用enumerate() 无需定义另一个变量来对抗迭代。
    • @alexhli 只是补充一下,enumerate 可以接受第二个参数,让您在需要时指定计数器的起始值 - 否则默认为 0。
    猜你喜欢
    • 2022-06-12
    • 2012-11-30
    • 2017-06-02
    • 1970-01-01
    • 2017-09-20
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多