Tôi mới đến Python 3 và thực sự có thể sử dụng một chút trợ giúp. Tôi có một tệp TXT chứa:
InstallPrompt=
DisplayLicense=
FinishMessage=
TargetName=D:\somewhere
FriendlyName=something
Tôi có một kịch bản Python mà cuối cùng, nên thay đổi chỉ hai dòng thành:
TargetName=D:\new
FriendlyName=Big
Bất cứ ai có thể giúp tôi, xin vui lòng? Tôi đã cố gắng tìm kiếm nó, nhưng tôi không tìm thấy thứ gì đó tôi có thể sử dụng. Các văn bản nên được thay thế có thể có độ dài khác nhau.
Đã hỏi ngày 26 tháng 3 năm 2010 lúc 23:27Mar 26, 2010 at 23:27
0
import fileinput
for line in fileinput.FileInput["file",inplace=1]:
sline=line.strip[].split["="]
if sline[0].startswith["TargetName"]:
sline[1]="new.txt"
elif sline[0].startswith["FriendlyName"]:
sline[1]="big"
line='='.join[sline]
print[line]
Đã trả lời ngày 26 tháng 3 năm 2010 lúc 23:54Mar 26, 2010 at 23:54
ghostdog74ghostdog74ghostdog74
316K56 Huy hiệu vàng254 Huy hiệu bạc341 Huy hiệu Đồng56 gold badges254 silver badges341 bronze badges
1
Một giải pháp rất đơn giản cho những gì bạn đang làm:
#!/usr/bin/python
import re
import sys
for line in open[sys.argv[1],'r'].readlines[]:
line = re.sub[r'TargetName=.+',r'TargetName=D:\\new', line]
line = re.sub[r'FriendlyName=.+',r'FriendlyName=big', line]
print line,
Bạn sẽ gọi điều này từ dòng lệnh là
TargetName=D:\new
FriendlyName=Big
1Đã trả lời ngày 26 tháng 3 năm 2010 lúc 23:46Mar 26, 2010 at 23:46
Câu chuyện Dan StorydanDan Story
9.7691 Huy hiệu vàng22 Huy hiệu bạc27 Huy hiệu đồng1 gold badge22 silver badges27 bronze badges
5
Viết vào một tệp tạm thời và việc đổi tên là cách tốt nhất để đảm bảo bạn sẽ không nhận được một tệp bị hỏng nếu có sự cố
import os
from tempfile import NamedTemporaryFile
fname = "lines.txt"
with open[fname] as fin, NamedTemporaryFile[dir='.', delete=False] as fout:
for line in fin:
if line.startswith["TargetName="]:
line = "TargetName=D:\\new\n"
elif line.startswith["FriendlyName"]:
line = "FriendlyName=Big\n"
fout.write[line.encode['utf8']]
os.rename[fout.name, fname]
Đã trả lời ngày 27 tháng 3 năm 2010 lúc 0:14Mar 27, 2010 at 0:14
John La Rooyjohn La RooyJohn La Rooy
Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges
Đây có phải là một tệp cấu hình [.ini] mà bạn đang cố gắng phân tích? Định dạng trông tương tự nhau, ngoại trừ không có phần tiêu đề. Bạn có thể sử dụng
TargetName=D:\new
FriendlyName=Big
2, mặc dù nó có thể thêm không gian xung quanh "" "[tức là" TargetName=D:\new
FriendlyName=Big
3 "so với" TargetName=D:\new
FriendlyName=Big
4 "], nhưng nếu những thay đổi đó không quan trọng với bạn, sử dụng TargetName=D:\new
FriendlyName=Big
2 là cách dễ dàng hơn và dễ bị lỗi hơn và dễ bị lỗi hơn hơn là cố gắng phân tích nó bằng tay mỗi lần.Tệp TXT [INI]:
[section name]
FinishMessage=
TargetName=D:\something
FriendlyName=something
Code:
import sys
from configparser import SafeConfigParser
def main[]:
cp = SafeConfigParser[]
cp.optionxform = str # Preserves case sensitivity
cp.readfp[open[sys.argv[1], 'r']]
section = 'section name'
options = {'TargetName': r'D:\new',
'FriendlyName': 'Big'}
for option, value in options.items[]:
cp.set[section, option, value]
cp.write[open[sys.argv[1], 'w']]
if __name__ == '__main__':
main[]
Tệp TXT [INI] [sau]:
[section name]
FinishMessage =
TargetName = D:\new
FriendlyName = Big
JFS
385K183 Huy hiệu vàng949 Huy hiệu bạc1624 Huy hiệu đồng183 gold badges949 silver badges1624 bronze badges
Đã trả lời ngày 27 tháng 3 năm 2010 lúc 3:31Mar 27, 2010 at 3:31
TargetName=D:\new
FriendlyName=Big
6 Script hoạt động cả Python 2.6+ và Python 3.x:#!/usr/bin/env python
from __future__ import print_function
import sys, fileinput
# here goes new values
substitions = dict[TargetName=r"D:\new", FriendlyName="Big"]
inplace = '-i' in sys.argv # make substitions inplace
if inplace:
sys.argv.remove['-i']
for line in fileinput.input[inplace=inplace]:
name, sep, value = line.partition["="]
if name in substitions:
print[name, sep, substitions[name], sep='']
else:
print[line, end='']
Example:
$ python3.1 subs_names.py input.txt
InstallPrompt=
DisplayLicense=
FinishMessage=
TargetName=D:\new
FriendlyName=Big
Nếu bạn hài lòng với đầu ra thì hãy thêm tham số
TargetName=D:\new
FriendlyName=Big
7 để thay đổi tại chỗ:TargetName=D:\new
FriendlyName=Big
0Đã trả lời ngày 27 tháng 3 năm 2010 lúc 0:48Mar 27, 2010 at 0:48
JFSJFSjfs
385K183 Huy hiệu vàng949 Huy hiệu bạc1624 Huy hiệu đồng183 gold badges949 silver badges1624 bronze badges