Распечатка значений строк с помощью itertuples (), которые отличаются по столбцам (чтобы не печатать пустые ячейки) - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть лист Excel, содержащий следующее:

key     topic   a      b      c      d     e
plants  flower  red    blue   green  pink  purple
space   moon    grey   blue   white
bugs    ants    red    black

Упрощенно, я хочу «распечатать» каждую строку для отдельных файлов, например:

file1.txt:
a) It is red.
b) It is blue.
c) It is green.
d) It is pink.
e) It is purple.

file2.txt:
a) It is grey.
b) It is blue.
c) It is white.

file3.txt:
a) It is red.
b) It is black.

Но, как вы можете видеть, каждая строка содержит различное количество столбцов.То есть есть пустые ячейки, которые я не хочу распечатывать.

Мне не нужен такой файл:

a) It is red.
b) It is black.
c) 
d) 
e)

Пока это мой код:

for row in df.itertuples():
    ques = open("file1.txt","w+")
    ques.write('It is '+row.a+'.')
    ques.write('It is '+row.b+'.')
    ques.write('It is '+row.c+'.')
    ques.write('It is '+row.d+'.')
    ques.write('It is '+row.e+'.')

Затем выдается ошибка TypeError: can only concatenate str (not "float") to str.Я почти уверен, что в столбцах d, e и c, d, e для второго и третьего вопросов ничего нет.

(И да, я знаю, что этот код будет неоднократно печататься в одном и том же file1.txtно я упростил код, чтобы сосредоточиться на моей основной проблеме - строки не имеют одинаковое количество столбцов.)

Итак, я попытался:

    for index in df.itertuples():
        ques.write(row.index)

Я получил этоошибка: TypeError: can only concatenate str (not "builtin_function_or_method") to str.

Я также пытался:

    if row.c is not None:
         ques.write('It is '+row.c+'.')
    if row.d is not 0:
         ques.write('It is '+row.d+'.')
# etc

Это также выдает ошибку.

Я знаю, что каким-то образом я должен использовать цикл, но после поиска вокруг я немного растерялся.Моя главная проблема заключается в том, что я не хочу, чтобы пустые ячейки были распечатаны.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ:

Я пытался ques.write(','.join(i for i in row[1:] if i is not np.NaN)) ихотя это работает, чтобы не выдавать ошибку, теперь он выводит все в строку.«Растения, цветок, красный, синий, зеленый, розовый, фиолетовый».

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

попробуйте набрать его в строку.

in

df=temp_df.copy() 
df=df.drop(columns=['key','topic'],axis="columns")
for row in df.itertuples(): 
   #print(row) 
   for x in row: 
   if isinstance(x,str): 
       print(x,type(x))
0 голосов
/ 20 сентября 2019

Я исправил проблему, выполнив следующее:

if row.c is not np.NaN:
   ques.write('It is '+row.c+'.')
if row.d is not np.NaN:
   ques.write('It is '+row.d+'.')
if row.e is not np.NaN:
   ques.write('It is '+row.e+'.')

Не совсем цикл, поэтому его нельзя увеличить, но в остальном он работает.Спасибо Генри Йику в комментариях к np.NaN.

0 голосов
/ 20 сентября 2019

Вы можете анализировать файл построчно и просто распечатать все после второго столбца:

with open(filename, "r") as f: 
    headers = next(f).split() 
    count = 1 
    for line in f: 
        line = line.split() 
        with open(f"file{count}.txt", "w") as outf: 
            outf.write("\n".join(line[2:])) 
        count += 1

РЕДАКТИРОВАТЬ: если ваш входной файл может иметь пустые столбцы в середине, например (последняя строка):

key     topic   a      b      c      d     e
plants  flower  red    blue   green  pink  purple
space   moon    grey   blue   white
bugs    ants    red    black
food    pasta   blue   pink         purple green

Это не сработает, так что если у вас есть такие случаи, просто дайте мне знать, и я отредактирую

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