Как вставить строки в файл, если их еще нет?

Итак, у меня есть текстовый файл с несколькими строками:

orange
melon
applez
more fruits
abcdefg

И у меня есть список строк, которые я хочу проверить:

names = ["apple", "banana"]

Теперь я хочу просмотреть все строки в файле и хочу вставить недостающие строки из списка имен, если их нет. Если они присутствуют, то их не следует вставлять.

Как правило, это не должно быть сложно, но забота обо всех новых строках и тому подобном довольно привередлива. Это моя попытка:

if not os.path.isfile(fpath):
    raise FileNotFoundError('Could not load username file', fpath)

with open(fpath, 'r+') as f:
    lines = [line.rstrip('\n') for line in f]
    if not "banana" in lines:
        lines.insert(0, 'banana')
    if not "apple" in lines:
        lines.insert(0, 'apple')

    f.writelines(lines)
    print("done")

Проблема в том, что мои значения не вставляются в новые строки, а добавляются. Также я чувствую, что мое решение, как правило, немного неуклюже. Есть ли лучший способ сделать это, который автоматически вставляет недостающие строки и заботится обо всех новых строках и т.д.?


person Kyu96    schedule 21.10.2019    source источник
comment
Можете ли вы опубликовать свою ошибку? Также проверьте это stackoverflow.com/questions/13248020/ (открытый файл r+ против a+)   -  person Wonka    schedule 21.10.2019


Ответы (2)


Вам нужно seek перейти на первую позицию в файле и использовать join записать каждое слово в новую строку, чтобы перезаписать его содержимое:

names = ["apple", "banana"]
with open(fpath, 'r+') as f:
    lines = [line.rstrip('\n') for line in f]
    for name in names:
        if name not in lines:
            # inserts on top, elsewise use lines.append(name) to append at the end of the file.
            lines.insert(0, name)

    f.seek(0) # move to first position in the file, to overwrite !
    f.write('\n'.join(lines))
    print("done")
person Maurice Meyer    schedule 21.10.2019

Сначала получите список всех имен пользователей в вашем файле, используя readlines(), а затем используйте понимание списка, чтобы определить отсутствующие имена пользователей из вашего списка names. Создайте новый список и запишите его в свой файл.

names = ["apple", "banana"]
new_list = List()

with open(fpath, 'r+') as f:
  usernames = f.readlines()
  res = [user for user in usernames if user not in names] 
  new_list = usernames + res

with open(fpath, 'r+') as f:  
  for item in new_list:
        f.write("%s\n" % item)
person po.pe    schedule 21.10.2019