#python #pandas
Вопрос:
У меня есть 4 кадра данных с данными :
финал_101
финал_102
финал_103
финал_104
Я хочу распечатать их в один текстовый файл, динамически вызывая их по последним цифрам. Я попытался использовать приведенный ниже код, но я не могу заставить его работать, так как динамический шаг просто дает строковое значение вместо фрейма данных:
file_extension = ['101', '102', '103', '104']
with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as f:
for names in file_extension :
f.write("n" f"{names}_data" "n")
new_file = 'final_' str(names)
new_file.loc['Total'] = new_file['samp'].sum()
f.write("n" str(new_file) "n")
Этот шаг new_file = 'final_' str(names)
просто дает строковое значение new_file, но не данные. Есть ли способ динамического вызова объекта?
Примечание. Файлы final_101, final_102, final_103, final_104 находятся в памяти, а не в каком-либо расположении файла.
также сабик упомянул различные сценарии, в которых они могут быть использованы
Правильное решение для этого кода приведено ниже.
dfs = {'101' : final_101, '102': final_102, '103': final_103, '104': final_104}
with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as out_f:
for i, (key, df) in enumerate(dfs.items()):
out_f.write("n" f"{key}_data" "n")
new_file = df.copy()
new_file.loc['Total'] = new_file['samp'].sum()
out_f.write("n" str(new_file) "n")
Комментарии:
1. «Я хочу распечатать их в один текстовый файл, динамически называя их по последним цифрам». не пытайтесь использовать переменные динамически подобным образом. Вместо этого используйте контейнер, такой как список или диктант
2. Я могу написать его отдельно, повторив строки записи 4 раза, но не могу понять, кто это делает с помощью функции.
3. @juanpa.arrivillaga Не могли бы вы, пожалуйста, объяснить немного больше? Извините, я немного новичок в этой логике, поэтому пытаюсь понять, что вы имеете в виду
Ответ №1:
(обновлено по комментариям…)
В python можно извлекать переменные по имени, но на самом деле это не рекомендуется.
Если их всего четыре, вы можете достаточно легко запрограммировать их:
dfs = [final_101, final_102, final_103, final_104]
with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as out_f:
for i, df in enumerate(dfs):
header = i == 0 # only write out the header for the first one
df.to_csv(out_f, header=header)
Если у вас есть переменное число, лучший способ изменить код, генерирующий их, чтобы он помещал данные в диктант, чтобы они назывались final[101]
или final['101']
(в зависимости от того, лучше ли 101 воспринимать как число или как текстовую метку). Тогда вы сможете повторить все сначала final.items()
, вот так:
with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as out_f:
for i, (key, df) in enumerate(final.items()):
header = i == 0 # only write out the header for the first one
# optionally write out key here
df.to_csv(out_f, header=header)
Если вам абсолютно необходимо искать переменные по именам, вы можете проверить globals()
; хотя на самом деле это не рекомендуется в повседневном программировании.
Комментарии:
1. Он показывает «[Errno 2] Нет такого файла или каталога: ‘final_101′». . Но файл существует в среде в виде фрейма данных.
2.
with open(f"{names}_data") as in_f:
это не открывает фрейм данных3. Ах, эти переменные находятся в памяти, а не в файлах?
4. Спасибо! это то, что мне было нужно. Я просто внес небольшие изменения в соответствии со своими потребностями и обновил код в разделе вопросов.
5. Кстати, если вы не закончите использовать
i
, вы можете опуститьenumerate
и просто использовать:for key, df in dfs.items():