Jawaban:
Pertama, buka file dan dapatkan semua baris Anda dari file. Kemudian buka kembali file dalam mode tulis dan tulis baris Anda kembali, kecuali baris yang ingin Anda hapus:
with open("yourfile.txt", "r") as f:
lines = f.readlines()
with open("yourfile.txt", "w") as f:
for line in lines:
if line.strip("\n") != "nickname_to_delete":
f.write(line)
Anda perlu strip("\n")
karakter baris baru dalam perbandingan karena jika file Anda tidak berakhir dengan karakter baris baru yang terakhir line
tidak akan baik.
Solusi untuk masalah ini dengan hanya satu buka:
with open("target.txt", "r+") as f:
d = f.readlines()
f.seek(0)
for i in d:
if i != "line you want to remove...":
f.write(i)
f.truncate()
Solusi ini membuka file dalam mode r / w ("r +") dan memanfaatkan pencarian untuk mengatur ulang f-pointer kemudian memotong untuk menghapus semuanya setelah penulisan terakhir.
for
loop, Anda akan berakhir dengan file yang ditimpa sebagian, dengan garis duplikat atau garis terpotong setengah. Anda mungkin ingin f.truncate()
benar setelahnya f.seek(0)
. Dengan begitu jika Anda mendapatkan kesalahan Anda hanya akan berakhir dengan file yang tidak lengkap. Tetapi solusi sebenarnya (jika Anda memiliki ruang disk) adalah untuk output ke file sementara dan kemudian menggunakan os.replace()
atau pathlib.Path(temp_filename).replace(original_filename)
untuk menukar dengan yang asli setelah semuanya berhasil.
i.strip('\n') != "line you want to remove..."
seperti yang disebutkan dalam jawaban yang diterima, itu akan menyelesaikan masalah saya dengan sempurna. Karena i
tidak melakukan apa pun untuk saya
Pilihan terbaik dan tercepat, daripada menyimpan segala sesuatu dalam daftar dan membuka kembali file untuk menulisnya, menurut pendapat saya untuk menulis ulang file di tempat lain.
with open("yourfile.txt", "r") as input:
with open("newfile.txt", "w") as output:
for line in input:
if line.strip("\n") != "nickname_to_delete":
output.write(line)
Itu dia! Dalam satu putaran dan satu-satunya Anda dapat melakukan hal yang sama. Ini akan jauh lebih cepat.
(output.write(line) for line in input if line!="nickname_to_delete"+"\n")
subprocess.call(['mv', 'newfile.txt', 'yourfile.txt'])
os.replace
(baru dalam python v 3.3) lebih lintas-platform daripada panggilan sistem mv
.
Ini adalah "fork" dari jawaban @Lother (yang saya yakin harus dianggap jawaban yang benar).
Untuk file seperti ini:
$ cat file.txt
1: october rust
2: november rain
3: december snow
Garpu dari solusi Lother ini bekerja dengan baik:
#!/usr/bin/python3.4
with open("file.txt","r+") as f:
new_f = f.readlines()
f.seek(0)
for line in new_f:
if "snow" not in line:
f.write(line)
f.truncate()
Perbaikan:
with open
, yang membuang penggunaan f.close()
if/else
untuk mengevaluasi jika string tidak ada di baris saat iniMasalah dengan membaca baris pada pass pertama dan membuat perubahan (menghapus baris tertentu) pada pass kedua adalah bahwa jika ukuran file Anda besar, Anda akan kehabisan RAM. Sebagai gantinya, pendekatan yang lebih baik adalah membaca baris, satu per satu, dan menuliskannya ke dalam file terpisah, menghilangkan yang tidak Anda butuhkan. Saya telah menjalankan pendekatan ini dengan file sebesar 12-50 GB, dan penggunaan RAM tetap hampir konstan. Hanya siklus CPU yang menunjukkan proses yang sedang berlangsung.
Saya menyukai pendekatan fileinput seperti yang dijelaskan dalam jawaban ini: Menghapus baris dari file teks (python)
Katakan misalnya saya punya file yang memiliki baris kosong di dalamnya dan saya ingin menghapus baris kosong, berikut cara saya menyelesaikannya:
import fileinput
import sys
for line_number, line in enumerate(fileinput.input('file1.txt', inplace=1)):
if len(line) > 1:
sys.stdout.write(line)
Catatan: Baris kosong dalam case saya memiliki panjang 1
Jika Anda menggunakan Linux, Anda dapat mencoba pendekatan berikut.
Misalkan Anda memiliki file teks bernama animal.txt
:
$ cat animal.txt
dog
pig
cat
monkey
elephant
Hapus baris pertama:
>>> import subprocess
>>> subprocess.call(['sed','-i','/.*dog.*/d','animal.txt'])
kemudian
$ cat animal.txt
pig
cat
monkey
elephant
Saya pikir jika Anda membaca file ke dalam daftar, maka lakukan itu Anda dapat mengulangi daftar untuk mencari nama panggilan yang ingin Anda singkirkan. Anda dapat melakukannya dengan lebih efisien tanpa membuat file tambahan, tetapi Anda harus menulis hasilnya kembali ke file sumber.
Begini cara saya melakukan ini:
import, os, csv # and other imports you need
nicknames_to_delete = ['Nick', 'Stephen', 'Mark']
Saya berasumsi nicknames.csv
mengandung data seperti:
Nick
Maria
James
Chris
Mario
Stephen
Isabella
Ahmed
Julia
Mark
...
Kemudian muat file ke dalam daftar:
nicknames = None
with open("nicknames.csv") as sourceFile:
nicknames = sourceFile.read().splitlines()
Selanjutnya, beralih ke daftar untuk mencocokkan input Anda untuk dihapus:
for nick in nicknames_to_delete:
try:
if nick in nicknames:
nicknames.pop(nicknames.index(nick))
else:
print(nick + " is not found in the file")
except ValueError:
pass
Terakhir, tulis kembali hasilnya ke file:
with open("nicknames.csv", "a") as nicknamesFile:
nicknamesFile.seek(0)
nicknamesFile.truncate()
nicknamesWriter = csv.writer(nicknamesFile)
for name in nicknames:
nicknamesWriter.writeRow([str(name)])
nicknamesFile.close()
Secara umum, Anda tidak bisa; Anda harus menulis seluruh file lagi (setidaknya dari titik perubahan sampai akhir).
Dalam beberapa kasus tertentu Anda dapat melakukan lebih baik dari ini -
jika semua elemen data Anda memiliki panjang yang sama dan tanpa urutan tertentu, dan Anda tahu offset yang ingin Anda singkirkan, Anda bisa menyalin item terakhir di atas yang akan dihapus dan memotong file sebelum item terakhir. ;
atau Anda bisa menimpa potongan data dengan nilai 'ini adalah data yang buruk, lewati saja' atau pertahankan tanda 'item ini telah dihapus' di elemen data yang disimpan sehingga Anda dapat menandainya dihapus tanpa memodifikasi file.
Ini mungkin berlebihan untuk dokumen pendek (ada yang di bawah 100 KB?).
Mungkin, Anda sudah mendapat jawaban yang benar, tetapi ini milik saya. Alih-alih menggunakan daftar untuk mengumpulkan data tanpa filter ( readlines()
metode apa ), saya menggunakan dua file. Satu untuk menyimpan data utama, dan yang kedua adalah untuk memfilter data saat Anda menghapus string tertentu. Ini kode:
main_file = open('data_base.txt').read() # your main dataBase file
filter_file = open('filter_base.txt', 'w')
filter_file.write(main_file)
filter_file.close()
main_file = open('data_base.txt', 'w')
for line in open('filter_base'):
if 'your data to delete' not in line: # remove a specific string
main_file.write(line) # put all strings back to your db except deleted
else: pass
main_file.close()
Semoga Anda menemukan ini berguna! :)
Simpan baris file dalam daftar, lalu hapus daftar baris yang ingin Anda hapus dan tulis baris yang tersisa ke file baru
with open("file_name.txt", "r") as f:
lines = f.readlines()
lines.remove("Line you want to delete\n")
with open("new_file.txt", "w") as new_f:
for line in lines:
new_f.write(line)
inilah beberapa metode lain untuk menghapus baris / a dari file:
src_file = zzzz.txt
f = open(src_file, "r")
contents = f.readlines()
f.close()
contents.pop(idx) # remove the line item from list, by line number, starts from 0
f = open(src_file, "w")
contents = "".join(contents)
f.write(contents)
f.close()
Anda bisa menggunakan
re
perpustakaan
Dengan asumsi bahwa Anda dapat memuat txt-file lengkap Anda. Anda kemudian mendefinisikan daftar nama panggilan yang tidak diinginkan dan kemudian menggantinya dengan string kosong "".
# Delete unwanted characters
import re
# Read, then decode for py2 compat.
path_to_file = 'data/nicknames.txt'
text = open(path_to_file, 'rb').read().decode(encoding='utf-8')
# Define unwanted nicknames and substitute them
unwanted_nickname_list = ['SourDough']
text = re.sub("|".join(unwanted_nickname_list), "", text)
Untuk menghapus baris file tertentu dengan nomor barisnya :
Ganti variabel nama file dan line_to_delete dengan nama file Anda dan nomor baris yang ingin Anda hapus.
filename = 'foo.txt'
line_to_delete = 3
initial_line = 1
file_lines = {}
with open(filename) as f:
content = f.readlines()
for line in content:
file_lines[initial_line] = line.strip()
initial_line += 1
f = open(filename, "w")
for line_number, line_content in file_lines.items():
if line_number != line_to_delete:
f.write('{}\n'.format(line_content))
f.close()
print('Deleted line: {}'.format(line_to_delete))
Contoh output :
Deleted line: 3
for nb, line in enumerate(f.readlines())
Ambil konten file, bagi dengan baris baru menjadi tuple. Kemudian, akses nomor baris tuple Anda, gabungkan tuple hasil Anda, dan timpa file tersebut.
tuple(f.read().split('\n'))
?? (2) "akses nomor baris tuple Anda" dan "gabungkan tuple hasil Anda" terdengar agak misterius; kode Python yang sebenarnya mungkin lebih dimengerti.
fileinput
seperti yang dijelaskan oleh @ jf-sebastian di sini . Tampaknya memungkinkan Anda untuk bekerja baris demi baris, melalui file sementara, semua denganfor
sintaksis sederhana .