函数不传递通过“ for”循环接收的值

时间:2019-07-05 06:57:38

标签: python pandas function for-loop

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

例如,对于df.loc [0],命令结果为TEXT01:12TEXT02“ LAS'5022268h'0023;。

  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:

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

1 个答案:

答案 0 :(得分:0)

文件对象是流。一旦到达文件末尾,任何新读取都将返回文件末尾条件,除非后退流。

因此,您只需要在调用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格式可以接受任何字符,包括其引号字符或字段内的字段分隔符。