python, 搜索 .txt 文件并注入字符
python, search .txt file and inject character
对于我对 python 如何提前处理字符串的无知,我深表歉意。我有一个至少 1000 行长的 .txt 文件。它看起来像下面
:dodge
1 6 some description string of unknown length
E7 8 another description string
3445 0 oil temp something description voltage over limit etc
:ford
AF 4 description of stuff
0 8 string descritiopn
我想做的基本上就是放一个“;”在每个字符串之前,我将得到的结果如下
:dodge
1 6 ;some description string of unknown length
E7 8 ;another description string
3445 0 ;oil temp something description voltage over limit etc
:ford
AF 4 ;description of stuff
0 8 ;string descritiopn
我的想法是打开文件,搜索“:”字符,下一行,转到“”字符,转到下一个“”字符并写一个“;”。另一个想法是如果下一个字符 != ":" 则转到文本文件中的 "/n" 字符,然后寻找第二个 space
导入系统
导入文件输入
with open("testDTC.txt", "r+") as f:
for line in f:
if ' ' in line: #read first space
if ' ' in line: #read second space
line.append(';')
f.write(line)
f.close()
我知道它离我需要的还差得很远,但我已经很久没有在 python 中进行字符串操作了。
根据您的示例,您的第二列中似乎有一个或多个由空格分隔的数字,例如8
、6
后面是第三列的一些描述,似乎没有任何数字。如果一般情况下是这样,不仅是这个例子,你可以利用这个事实搜索由空格分隔的数字并在其后添加;
,如下所示:
重新导入
rep = re.compile(r'(\s\d+\s)')
out_lines = []
with open("file.txt", "r+") as f:
for line in f:
re_match = rep.search(line)
if re_match:
# append ; after the found expression.
line = line.replace(re_match.group(1), re_match.group(1)+';')
out_lines.append(line)
with open('file2.txt', 'w') as f:
f.writelines(out_lines)
得到的file2.txt如下:
:dodge
1 6 ;some description string of unknown length
E7 8 ;another description string
3445 0 ;oil temp something description voltage over limit etc
:ford
AF 4 ;description of stuff
0 8 ;string descritiopn
这就是我要做的:
for line in f:
if ' ' in line:
sp = line.split(' ', 2)
line = '%s %s ;%s' % (sp[0], sp[1], sp[2])
您只需要在空格上拆分两次并连接字符串,您不需要正则表达式来实现简单的重复模式:
with open("testDTC.txt") as f:
for line in f:
if line.strip() and not line.startswith(":"):
spl = line.split(None,2)
print("{} ;{}".format(" ".join(spl[:2]),spl[2]))
要将更改写入原始文件,您可以使用 fileinput.input
和 inplace=True
:
from fileinput import input
for line in input("testDTC.txt",inplace=True):
if line.strip() and not line.startswith(":"):
spl = line.split(None,2)
print("{} ;{}".format(" ".join(spl[:2]),spl[2]),end="")
else:
print(line,end="")
我们可以解压而不是索引:
a, b, c = line.split(None,2)
print("{} {} ;{}".format(a, b, c),end="")
输出:
:dodge
1 6 ;some description string of unknown length
E7 8 ;another description string
3445 0 ;oil temp something description voltage over limit etc
:ford
AF 4 ;description of stuff
0 8 ;string descritiopn
对于 python 2,您可以删除 end=""
并在打印语句后使用逗号代替,即 print(line),
我们避免使用 line.startswith(":")
的起始段落行和 if line.strip()
的空行。
您可以使用非常简单的算法来执行此操作,而无需调用正则表达式,这样您就可以看到发生了什么。
with open('test.txt') as infile:
with open('out.txt', 'w') as outfile:
for line in infile:
if not line or line.startswith(':'): # Blank or : line
outfile.write(line or '\n') # pass it through
else:
line_parts = line.split(None, 2) # split at most twice
try:
# try adding the semicolon after the 2nd space
line_parts[2] = ';' + line_parts[2]
except IndexError:
pass
outfile.write(' '.join(line_parts))
如果你真的想一次读取一个文件中的字符,你最终会使用 read
方法和 seek
,但这在 Python 中是不必要的,因为你有高级构造,如文件迭代和强大的字符串方法来帮助你。
由于您只有 1000 行左右,我认为您可以使用 readlines() 一次读取所有内容并为每行使用拆分。如果该行只有一个元素,则打印它,然后调用另一个循环,该循环处理具有多个元素的后续行,并用分号和元素的串联替换第三个 [2] 元素。然后你必须做一些事情来很好地输出行(这里有连接,但有很多其他的解决方案)取决于你想要什么。
with open('testDTC.txt') as fp:
lines = fp.readlines()
for i in xrange(len(lines)):
if len(lines[i].split()) == 1:
print lines[i][:-1]
i += 1
while len(lines[i].split()) > 0:
spl = lines[i].split()
spl[2] = ";"+spl[2]
print " ".join(spl)
i += 1
if i == len(lines):
break
print
对于我对 python 如何提前处理字符串的无知,我深表歉意。我有一个至少 1000 行长的 .txt 文件。它看起来像下面
:dodge
1 6 some description string of unknown length
E7 8 another description string
3445 0 oil temp something description voltage over limit etc
:ford
AF 4 description of stuff
0 8 string descritiopn
我想做的基本上就是放一个“;”在每个字符串之前,我将得到的结果如下
:dodge
1 6 ;some description string of unknown length
E7 8 ;another description string
3445 0 ;oil temp something description voltage over limit etc
:ford
AF 4 ;description of stuff
0 8 ;string descritiopn
我的想法是打开文件,搜索“:”字符,下一行,转到“”字符,转到下一个“”字符并写一个“;”。另一个想法是如果下一个字符 != ":" 则转到文本文件中的 "/n" 字符,然后寻找第二个 space 导入系统 导入文件输入
with open("testDTC.txt", "r+") as f:
for line in f:
if ' ' in line: #read first space
if ' ' in line: #read second space
line.append(';')
f.write(line)
f.close()
我知道它离我需要的还差得很远,但我已经很久没有在 python 中进行字符串操作了。
根据您的示例,您的第二列中似乎有一个或多个由空格分隔的数字,例如8
、6
后面是第三列的一些描述,似乎没有任何数字。如果一般情况下是这样,不仅是这个例子,你可以利用这个事实搜索由空格分隔的数字并在其后添加;
,如下所示:
重新导入
rep = re.compile(r'(\s\d+\s)')
out_lines = []
with open("file.txt", "r+") as f:
for line in f:
re_match = rep.search(line)
if re_match:
# append ; after the found expression.
line = line.replace(re_match.group(1), re_match.group(1)+';')
out_lines.append(line)
with open('file2.txt', 'w') as f:
f.writelines(out_lines)
得到的file2.txt如下:
:dodge
1 6 ;some description string of unknown length
E7 8 ;another description string
3445 0 ;oil temp something description voltage over limit etc
:ford
AF 4 ;description of stuff
0 8 ;string descritiopn
这就是我要做的:
for line in f:
if ' ' in line:
sp = line.split(' ', 2)
line = '%s %s ;%s' % (sp[0], sp[1], sp[2])
您只需要在空格上拆分两次并连接字符串,您不需要正则表达式来实现简单的重复模式:
with open("testDTC.txt") as f:
for line in f:
if line.strip() and not line.startswith(":"):
spl = line.split(None,2)
print("{} ;{}".format(" ".join(spl[:2]),spl[2]))
要将更改写入原始文件,您可以使用 fileinput.input
和 inplace=True
:
from fileinput import input
for line in input("testDTC.txt",inplace=True):
if line.strip() and not line.startswith(":"):
spl = line.split(None,2)
print("{} ;{}".format(" ".join(spl[:2]),spl[2]),end="")
else:
print(line,end="")
我们可以解压而不是索引:
a, b, c = line.split(None,2)
print("{} {} ;{}".format(a, b, c),end="")
输出:
:dodge
1 6 ;some description string of unknown length
E7 8 ;another description string
3445 0 ;oil temp something description voltage over limit etc
:ford
AF 4 ;description of stuff
0 8 ;string descritiopn
对于 python 2,您可以删除 end=""
并在打印语句后使用逗号代替,即 print(line),
我们避免使用 line.startswith(":")
的起始段落行和 if line.strip()
的空行。
您可以使用非常简单的算法来执行此操作,而无需调用正则表达式,这样您就可以看到发生了什么。
with open('test.txt') as infile:
with open('out.txt', 'w') as outfile:
for line in infile:
if not line or line.startswith(':'): # Blank or : line
outfile.write(line or '\n') # pass it through
else:
line_parts = line.split(None, 2) # split at most twice
try:
# try adding the semicolon after the 2nd space
line_parts[2] = ';' + line_parts[2]
except IndexError:
pass
outfile.write(' '.join(line_parts))
如果你真的想一次读取一个文件中的字符,你最终会使用 read
方法和 seek
,但这在 Python 中是不必要的,因为你有高级构造,如文件迭代和强大的字符串方法来帮助你。
由于您只有 1000 行左右,我认为您可以使用 readlines() 一次读取所有内容并为每行使用拆分。如果该行只有一个元素,则打印它,然后调用另一个循环,该循环处理具有多个元素的后续行,并用分号和元素的串联替换第三个 [2] 元素。然后你必须做一些事情来很好地输出行(这里有连接,但有很多其他的解决方案)取决于你想要什么。
with open('testDTC.txt') as fp:
lines = fp.readlines()
for i in xrange(len(lines)):
if len(lines[i].split()) == 1:
print lines[i][:-1]
i += 1
while len(lines[i].split()) > 0:
spl = lines[i].split()
spl[2] = ";"+spl[2]
print " ".join(spl)
i += 1
if i == len(lines):
break
print