#python #python-3.x
#python #python-3.x
Вопрос:
Язык: python (версия: 3.7.3) Уровень владения: новичок
Я хочу удалить все начальные и конечные пробелы в каждой строке файла. Поэтому я использовал встроенный метод ‘strip ()’, который почти выполняет эту работу, но мой код начал бездействовать с нижней части файла, что привело к дублированию строк в файле. Любая помощь будет очень полезна для достижения цели.
Мой код выглядит следующим образом:
class filecorrection:
def removeLeadingandTrailingSpacesinaFile(self, fromFile):
with open(fromFile, 'r ') as file:
lines = file.readlines()
for line in lines:
file.write(line.strip() "n")
cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile("filepath")
Я попытался использовать метод поиска, чтобы вывести указатель в начало файла, но не получил идеального результата.
class filecorrection:
def removeLeadingandTrailingSpacesinaFile(self, fromFile):
with open(fromFile, 'r ') as file:
lines = file.readlines()
**file.seek(0)**
for line in lines:
file.write(line.strip() "n")
cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile("filepath")
Ожидается: (удаление конечных и начальных пробелов)
<book id="bk105">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>testing</publish_date>
</book>
Актуально:
<book id="bk105">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>testing</publish_date>
</book><book id="bk105">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>testing</publish_date>
</book>
Комментарии:
1. Для этого вам не нужен класс.
remove_leading_and_trailing_spaces_in_a_file
(обратите внимание на предпочтительное соглашение об именовании методов) должно быть просто обычной функцией.
Ответ №1:
Вы можете открыть файл дважды следующим образом
class filecorrection:
def removeLeadingandTrailingSpacesinaFile(self, fromFile):
lines = []
with open(fromFile, 'r') as file:
lines = file.readlines()
with open(fromFile, "w") as file:
for line in lines:
file.write(line.strip() "n")
cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile("test.xml")
вместо того, чтобы пытаться одновременно читать и записывать в файл. Открытие файла в режиме записи ( w
) приведет к усечению файла до нулевой длины и началу записи с самого начала.
Комментарии:
1. Открытие файла в
w
режиме mode, прежде всего, приведет к его усечению, а не только к установке указателя в начале, который OP уже пытался использоватьseek(0)
.2. Запись в другой файл работает, как и ожидалось. Однако есть ли альтернатива для достижения того же в том же файле?
3. @PrasadRajassekaran Безопаснее сначала записывать в отдельный файл и заменять оригинал только после того, как вы узнаете, что полная запись прошла успешно, чтобы избежать повреждения вашего оригинала в случае ошибки.
4. Это приведет к записи поверх того же файла, что и запись в другой файл.
Ответ №2:
Проблемы с вашим кодом:
- Вы пытаетесь выполнить запись в тот же входной файл.
Также попробуйте использовать разные переменные для строк, которые вы читаете, и для новых строк, которые вы создаете. Это хорошая практика.
Смотрите обновленный код ниже.
with open(fromFile, 'r ') as infile,
open(writeFile, 'w') as outfile:
for line in infile:
new_line = line.rstrip('n').strip()
#now write the new line to out file
outfile.write(new_line "n")
Ответ №3:
Вы можете использовать другой файл для хранения промежуточных результатов, а затем заменить им исходный файл. Здесь вы читаете и записываете в один и тот же файл.
import pathlib
import shutil
class filecorrection:
def removeLeadingandTrailingSpacesinaFile(self, fromFile):
parent_path=pathlib.Path(fromFile).parent
# Make sure you have permissions to create a file. If not
# you can save intermediate results in memory instead.
temp_file = str(parent_path / "temp_file")
with open(fromFile, 'r ') as file, open(temp_file, 'w ') as temp:
for line in file:
temp.write(line.strip() "n")
shutil.move(temp_file, fromFile)
cm = filecorrection()
cm.removeLeadingandTrailingSpacesinaFile('file.txt')