Как вставить строки в файл, если его еще нет? - PullRequest
0 голосов
/ 21 октября 2019

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

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")

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

Ответы [ 3 ]

1 голос
/ 21 октября 2019

Вам необходимо 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")
1 голос
/ 21 октября 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)
1 голос
/ 21 октября 2019
file_name = r'<file-path>' # full path of file

names = ["apple", "banana"] # user list of word


with open(file_name, 'r+') as f: # opening file as object will automatically handle all the conditions
    x = f.readlines() # reading all the lines in a list, no worry about '\n'

    # checking if the user word is present in the file or not
    for name in names:
        if name not in x: # if word not in file then write the word to the file
            f.write('\n'+name )
...