#python-3.x #list #function
#python-3.x #Список #функция
Вопрос:
Я пытаюсь создать 2 функции.
-
readfiles(file_path)
, Который считывает файл, указанный file_path и возвращает список строк, содержащих каждую строку в файле. -
writefiles(lines, file_path)
Это записывает построчно содержимое строк списка в файл, указанный file_path .
При использовании один за другим выходной файл должен быть точной копией входного файла (включая форматирование)
Это то, что у меня есть до сих пор.
file_path = ("/myfolder/text.txt", "r")
def readfiles(file_path):
with open file_path as f:
for line in f:
return line
lst = list[]
lst = line
lst.append(line)
return lst
read_file(file_path)
lines = lst []
def writefiles(lines, file_path):
with open ("file_path", "w") as f:
for line in lst:
f.write(line)
f.write("n")
Я могу заставить это работать, когда использую это для чтения
with open("/myfolder/text.txt", "r") as f:
for line in f:
print(line, end='')
и это для записи
with open ("/myfolder/text.txt", "w") as f:
for line in f:
f.write(line)
f.write("n")
Но когда я пытаюсь поместить их в функции, все это портится.
Я не уверен, почему, я знаю, что это простой вопрос, но он просто не подходит для меня. Я прочитал документацию по этому вопросу, но я не полностью ее понимаю и нахожусь в тупике. Что не так с моими функциями?
Я получаю различные ошибки от
lst = list[]
^
SyntaxError: invalid syntax
Для
lst or list is not callable
Также я знаю, что есть похожие вопросы, но те, которые я нашел, похоже, не определяют функцию.
Ответ №1:
Проблемы с вашим кодом объясняются в комментариях
file_path = ("/myfolder/text.txt", "r") # this is a tupple of 2 elements should be file_path = "/myfolder/text.txt"
def readfiles(file_path):
with open file_path as f: # "open" is a function and will probably throw an error if you use it without parenthesis
# use open this way: open(file_path, "r")
for line in f:
return line # it will return the first line and exit the function
lst = list[] # "lst = []" is how you define a list in python. also you want to define it outside the loop
lst = line # you are replacing the list lst with the string in line
lst.append(line) # will throw an error because lst is a string now and doesn't have the append method
return lst
read_file(file_path) # should be lines = read_file(file_path)
lines = lst [] # lines is an empty list
def writefiles(lines, file_path):
with open ("file_path", "w") as f:
for line in lst: # this line should have 1 more tabulation
f.write(line) # this line should have 1 more tabulation
f.write("n") # this line should have 1 more tabulation
Вот как должен выглядеть код
def readfiles(file_path):
lst = []
with open(file_path) as f:
for line in f:
lst.append(line.strip("n"))
return lst
def writefiles(lines, file_path):
with open(file_path, "w") as f:
for line in lines:
f.write(line "n")
file_path = "/myfolder/text.txt"
filepathout = "myfolder/text2.txt"
lines = readfiles(file_path)
writefiles(lines, filepathout)
Более питонический способ сделать это
# readlines is a built-in function in python
with open(file_path) as f:
lines = f.readlines()
# stripping line returns
lines = [line.strip("n") for line in lines]
# join will convert the list to a string by adding a n between the list elements
with open(filepathout, "w") as f:
f.write("n".join(lines))
ключевые моменты:
- the function stops after reaching the return statement
- be careful where you define your variable.
i.e "lst" in a for loop will get redefined after each iteration
определение переменных:
- for a list: list_var = []
- for a tuple: tup_var = (1, 2)
- for an int: int_var = 3
- for a dictionary: dict_var = {}
- for a string: string_var = "test"
Комментарии:
1. Спасибо, мне удалось выяснить это из ответа Airsquids, но это очень полезно.
Ответ №2:
Здесь поможет пара учебных моментов.
В вашей функции чтения вы вроде как близки. Однако вы не можете поместить return
оператор в цикл. Как только функция попадает в это место в первый раз, она заканчивается. Кроме того, если вы собираетесь создать контейнер для хранения списка прочитанных объектов, вам нужно сделать это перед запуском цикла. Наконец, ничего не называйте list
. Это ключевое слово. Если вы хотите создать новый элемент списка, просто сделайте что-то вроде: results = list()
или results = []
Итак, в псевдокоде вы должны:
Make a list to hold results
Open the file as you are now
Make a loop to loop through lines
append to the results list
return the results (outside the loop)
Ваш writefiles
очень близок. Вы должны перебирать lines
переменную, которая является параметром вашей функции. Прямо сейчас вы ссылаетесь lst
на то, что не является параметром вашей функции.
Удачи!
Комментарии:
1. Спасибо за вашу помощь, я все понял 🙂