【问题标题】:function does not pass a value received through "for" loop函数不传递通过“for”循环接收到的值
【发布时间】:2019-07-05 06:57:38
【问题描述】:

我正在从 2 个文件创建命令:一个在 3 行中有命令('comando.txt'),第二个有参数(file.txt) txt 中的命令包含无法在 csv 或列表上设置的字符,例如 (" ' 和 ,)。

例如,命令结果是 TEXT01:12TEXT02"LAS'5022268h'0023; for df.loc[0]。

  1. 打开 comando.txt 后,它会将行号传递给 paso 函数。
  2. 如果打印 i = row,则函数从 df 接收每个索引行。
  3. 指令for line in f1: i 的值甚至没有通过它上面收到的print(i)
import csv
import pandas as pd

new_text = ''

def paso(row):
    i = row
    j=0
    result=''
    # 2 - it print row number that function
    print(i)
    for line in f1:
        # 3 - ERROR is here, the unique value for i=0, never pass
        #print(i) 
        strip = line.strip()
        result = result + add_para(strip,i,j)
        j=j+1
    #The result is TEXT01:012TEXT02"LAS'5022268h'0023;
    return result

def add_para(comando,valor,j):
    if j< columnas:
        #print(row)
        comando = comando +str(df.iloc[row,j])
        return comando
    else:
        comando=comando
        return comando

with open('file.txt') as f2:
    df = pd.read_csv(f2,header=None)

filas = df.shape[0]
columnas = df.shape[1]

with open('comando.txt') as f1:
    for row in range(filas):
        for col in range(1):
            # 1 - it passes row number to function "paso" 
            regreso = paso(row)
        #print(regreso)

打印输出

In [44]:
with open('comando.txt') as f1:
    for line in f1:
        print(line.strip())


Out[45]:


TEXT01:
TEXT02"LAS'
h'0023;
In [45]:  df.head()

Out[45]:     0    1
        0   12 5022268
        1   13 5022269 
        2   14 5022277 
        3   15 5022279 
        4   16 5022377

没有显示错误,但行号i如何传递到for line in f1:

例如,对于df.loc[0],命令结果是TEXT01:12TEXT02"LAS'5022268h'0023;,对于df.loc[1],第二个命令是TEXT01:13TEXT02"LAS'5022269h'0023; ...等

【问题讨论】:

  • 似乎你在“影子变量”上受了很多苦,def add_para, i had no idea where did row 块来自
  • 是的,我有,我必须检查一下,有什么信息链接吗?

标签: python pandas function for-loop


【解决方案1】:

文件对象是一个流。一旦到达文件结尾,任何新的读取都将返回文件结尾条件,除非流被倒带。

所以你只需要在调用paso之前回退文件:

with open('comando.txt') as f1:
    for row in range(filas):
        for col in range(1):
            # 1 - it passes row number to function "paso" 
            f1.seek(0)
            regreso = paso(row)
        print(regreso)

有了你的样本数据,就够了:

0
TEXT01:12TEXT02"LAS'5022268h'0023;
1
TEXT01:13TEXT02"LAS'5022269h'0023;
2
TEXT01:14TEXT02"LAS'5022277h'0023;
3
TEXT01:15TEXT02"LAS'5022279h'0023;
4
TEXT01:16TEXT02"LAS'5022377h'0023;

顺便说一句,你写道:

txt 中的命令包含无法在 csv 上设置的字符,例如 (" ' 和 ,)

这是错误的。 csv 格式可以接受任何字符,包括其引号字符或字段内的字段分隔符,前提是引号字符是双倍的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2019-05-14
    相关资源
    最近更新 更多