функция не передает значение, полученное через цикл for - PullRequest
0 голосов
/ 05 июля 2019

Я создаю команды из 2 файлов: один из них имеет команду в 3 строки ('comando.txt'), второй имеет параметры (file.txt) Команды в txt содержат такие символы, как ("'и,), которые нельзя установить в csv или list.

Например, результатом команды является TEXT01: 12TEXT02 "LAS'5022268h'0023; для 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:

Например, результатом команды является TEXT01:12TEXT02"LAS'5022268h'0023; для df.loc[0] и вторая команда TEXT01:13TEXT02"LAS'5022269h'0023; для df.loc[1] ... etc

1 Ответ

0 голосов
/ 05 июля 2019

Файловый объект - это поток. Как только он достигнет конца файла, любое новое чтение вернет условие конца файла, если только поток не перезаписан.

Так что вам просто нужно перемотать файл перед вызовом 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 может принимать любые символы, включая символ цитирования или разделитель полей, внутри поля при условии, что символ цитирования удваивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...