有沒有辦法做到這一點?說我有一個文件,該文件即是這樣的名單:用Python在文件的中間插入行?
- 阿爾弗雷德
- 比爾
- 唐納德
我怎麼能插入第三個名字,「查理」,在行x(在這種情況下是3),並自動發送所有其他人下來一行?我已經看到過類似的其他問題,但他們沒有得到有用的答案。它可以完成,最好使用方法或循環?
有沒有辦法做到這一點?說我有一個文件,該文件即是這樣的名單:用Python在文件的中間插入行?
我怎麼能插入第三個名字,「查理」,在行x(在這種情況下是3),並自動發送所有其他人下來一行?我已經看到過類似的其他問題,但他們沒有得到有用的答案。它可以完成,最好使用方法或循環?
這是一種訣竅。
f = open("path_to_file", "r")
contents = f.readlines()
f.close()
contents.insert(index, value)
f = open("path_to_file", "w")
contents = "".join(contents)
f.write(contents)
f.close()
「指數」和「價值」是您所選擇的線路和價值,線條從0
file.readlines()
或file.read().split('\n')
list.insert()
在那裏插入一個新的列表元素。只需注意一點,'file.read.split('\ ''''應該是'file.read()。split('\ n')' – Harry
起您只需將數據讀入一個列表,並插入您希望新記錄。
names = []
with open('names.txt', 'r+') as fd:
for line in fd:
names.append(line.split(' ')[-1].strip())
names.insert(2, "Charlie") # element 2 will be 3. in your list
fd.seek(0)
fd.truncate()
for i in xrange(len(names)):
fd.write("%d. %s\n" %(i + 1, names[i]))
你不告訴我們,輸出應該是什麼樣子,那麼一個可能的解釋是,您要使用這個輸出:
(Insert Charlie,then add 1所有後續行)這裏是一個可能的解決方案:
def insert_line(input_stream, pos, new_name, output_stream):
inserted = False
for line in input_stream:
number, name = parse_line(line)
if number == pos:
print >> output_stream, format_line(number, new_name)
inserted = True
print >> output_stream, format_line(number if not inserted else (number + 1), name)
def parse_line(line):
number_str, name = line.strip().split()
return (get_number(number_str), name)
def get_number(number_str):
return int(number_str.split('.')[0])
def format_line(number, name):
return add_dot(number) + ' ' + name
def add_dot(number):
return str(number) + '.'
input_stream = open('input.txt', 'r')
output_stream = open('output.txt', 'w')
insert_line(input_stream, 3, 'Charlie', output_stream)
input_stream.close()
output_stream.close()
如果你要搜索一個文件的子串,並添加一個新的文本到下一行,優雅的方式做一個如下:
import fileinput
for line in fileinput.FileInput(file_path,inplace=1):
if "TEXT_TO_SEARCH" in line:
line=line.replace(line,line+"NEW_TEXT")
print line,
在python3上,'print(line,end ='')'對於不在行間插入額外換行符很有用。 –
還有就是我在解決這一問題找到有用的技術組合:
with open(file, 'r+') as fd:
contents = fd.readlines()
contents.insert(index, new_string) # new_string should end in a newline
fd.seek(0) # readlines consumes the iterator, so we need to start over
fd.writelines(contents) # No need to truncate as we are increasing filesize
在我們特定的應用,我們希望它某些字符串後加:
with open(file, 'r+') as fd:
contents = fd.readlines()
if match_string in contents[-1]: # Handle last line to prevent IndexError
contents.append(insert_string)
else:
for index, line in enumerate(contents):
if match_string in line and insert_string not in contents[index + 1]:
contents.insert(index + 1, insert_string)
break
fd.seek(0)
fd.writelines(contents)
如果你希望它在比賽的每個實例後插入的文本,而不是僅僅是第一,取出else:
(並適當取消縮進)和break
。
還請注意and insert_string not in contents[index + 1]:
阻止它在match_string
之後添加多個副本,因此可以反覆運行。
我懷疑你沒有找到解決方案,這與一些基礎研究。你確定你已經完成了嗎? –
@AbhranilDas感謝tkbx的良好措辭我立即找到了答案! – dmeu
相關:[如何在閱讀文本內容時向文本文件的中間寫入內容?](http://stackoverflow.com/q/16556944/4279) – jfs