0

I have a big text file,

zhang
zhipeng
peng

I want let before or left N line write a str "--" into the text file.

zhang
--zhipeng
peng

I don't want read all file to memory, because the file is so big. Somewhat similar marking some line of the file.


Answer


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>/opt/work/users/zhanghzipeng/baidu_baike/baike/utils/text_helper.py.html</title>
<meta name="Generator" content="Vim/7.2">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#000000" text="#ffffff"><font face="monospace">
<font color="#ffff00">&nbsp;1 </font><font color="#00ffff"># -*- coding:utf-8 -*-</font><br>
<font color="#ffff00">&nbsp;2 </font><br>
<font color="#ffff00">&nbsp;3 </font><br>
<font color="#ffff00">&nbsp;4 </font><font color="#00ffff"># @version: 1.0</font><br>
<font color="#ffff00">&nbsp;5 </font><font color="#00ffff"># @author: Zhipeng Zhang</font><br>
<font color="#ffff00">&nbsp;6 </font><font color="#00ffff"># @date: '2015/5/28'</font><br>
<font color="#ffff00">&nbsp;7 </font><font color="#ff40ff">import</font>&nbsp;os<br>
<font color="#ffff00">&nbsp;8 </font><br>
<font color="#ffff00">&nbsp;9 </font><font color="#ff40ff">import</font>&nbsp;fileinput<br>
<font color="#ffff00">10 </font><br>
<font color="#ffff00">11 </font><br>
<font color="#ffff00">12 </font><font color="#ffff00">def</font>&nbsp;<font color="#00ffff">rewrite_line</font>(filename, lineno, text, left=True, right=False):<br>
<font color="#ffff00">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;f = fileinput.input(filename, inplace=1)<br>
<font color="#ffff00">14 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">for</font>&nbsp;line <font color="#ffff00">in</font>&nbsp;f:<br>
<font color="#ffff00">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_text = line.replace(&quot;<font color="#ff40ff">\r\n</font>&quot;, &quot;&quot;).replace(&quot;<font color="#ff40ff">\n</font>&quot;, &quot;&quot;)<br>
<font color="#ffff00">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">if</font>&nbsp;f.lineno() == lineno:<br>
<font color="#ffff00">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">if</font>&nbsp;left:<br>
<font color="#ffff00">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;text + line_text<br>
<font color="#ffff00">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">elif</font>&nbsp;right:<br>
<font color="#ffff00">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;line_text + text<br>
<font color="#ffff00">21 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">else</font>:<br>
<font color="#ffff00">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;text<br>
<font color="#ffff00">23 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">else</font>:<br>
<font color="#ffff00">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;line_text<br>
<font color="#ffff00">25 </font>&nbsp;&nbsp;&nbsp;&nbsp;f.close()<br>
<font color="#ffff00">26 </font><br>
<font color="#ffff00">27 </font><font color="#ffff00">def</font>&nbsp;<font color="#00ffff">cat</font>(filename):<br>
<font color="#ffff00">28 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">with</font>&nbsp;file(filename) <font color="#ff40ff">as</font>&nbsp;f:<br>
<font color="#ffff00">29 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;f.read()<br>
<font color="#ffff00">30 </font>&nbsp;&nbsp;&nbsp;&nbsp;os.remove(filename)<br>
<font color="#ffff00">31 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">with</font>&nbsp;file(filename, &quot;<font color="#ffff00">w</font>&quot;)<font color="#ff40ff">as</font>&nbsp;f:<br>
<font color="#ffff00">32 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(&quot;<font color="#ffff00">a</font><font color="#ff40ff">\n</font><font color="#ffff00">b</font><font color="#ff40ff">\n</font><font color="#ffff00">c</font>&quot;)<br>
<font color="#ffff00">33 </font><br>
<font color="#ffff00">34 </font><font color="#ffff00">def</font>&nbsp;<font color="#00ffff">test</font>():<br>
<font color="#ffff00">35 </font>&nbsp;&nbsp;&nbsp;&nbsp;filename = &quot;<font color="#ffff00">rewrite.test</font>&quot;<br>
<font color="#ffff00">36 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">with</font>&nbsp;file(filename, &quot;<font color="#ffff00">w</font>&quot;)<font color="#ff40ff">as</font>&nbsp;f:<br>
<font color="#ffff00">37 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(&quot;<font color="#ffff00">a</font><font color="#ff40ff">\n</font><font color="#ffff00">b</font><font color="#ff40ff">\n</font><font color="#ffff00">c</font>&quot;)<br>
<font color="#ffff00">38 </font><br>
<font color="#ffff00">39 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;&quot;<font color="#ffff00">new file:</font>&quot;&nbsp;+ filename<br>
<font color="#ffff00">40 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;&quot;<font color="#ffff00">file content: a</font><font color="#ff40ff">\n</font><font color="#ffff00">b</font><font color="#ff40ff">\n</font><font color="#ffff00">c</font>&quot;<br>
<font color="#ffff00">41 </font><br>
<font color="#ffff00">42 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;&quot;<font color="#ffff00">--------start test---------</font>&quot;<br>
<font color="#ffff00">43 </font><br>
<font color="#ffff00">44 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;filename, &quot;<font color="#ffff00">line:</font>&quot;, 2, &quot;<font color="#ffff00">left add # --&gt; #b?</font>&quot;<br>
<font color="#ffff00">45 </font>&nbsp;&nbsp;&nbsp;&nbsp;rewrite_line(filename, 2, &quot;<font color="#ffff00">#</font>&quot;, left=True)<br>
<font color="#ffff00">46 </font>&nbsp;&nbsp;&nbsp;&nbsp;cat(filename)<br>
<font color="#ffff00">47 </font><br>
<font color="#ffff00">48 </font><br>
<font color="#ffff00">49 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;filename, &quot;<font color="#ffff00">line:</font>&quot;, 2, &quot;<font color="#ffff00">right add #END --&gt; b#END?</font>&quot;<br>
<font color="#ffff00">50 </font>&nbsp;&nbsp;&nbsp;&nbsp;rewrite_line(filename, 2, &quot;<font color="#ffff00">#END</font>&quot;, left=False, right=True)<br>
<font color="#ffff00">51 </font>&nbsp;&nbsp;&nbsp;&nbsp;cat(filename)<br>
<font color="#ffff00">52 </font><br>
<font color="#ffff00">53 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">print</font>&nbsp;filename, &quot;<font color="#ffff00">line:</font>&quot;, 1, &quot;<font color="#ffff00">&nbsp;rewrite a --&gt; zhipeng?</font>&quot;<br>
<font color="#ffff00">54 </font>&nbsp;&nbsp;&nbsp;&nbsp;rewrite_line(filename, 1, &quot;<font color="#ffff00">zhipeng</font>&quot;, left=False, right=False)<br>
<font color="#ffff00">55 </font>&nbsp;&nbsp;&nbsp;&nbsp;cat(filename)<br>
<font color="#ffff00">56 </font><br>
<font color="#ffff00">57 </font>&nbsp;&nbsp;&nbsp;&nbsp;os.remove(filename)<br>
<font color="#ffff00">58 </font><br>
<font color="#ffff00">59 </font><br>
<font color="#ffff00">60 </font><font color="#ffff00">if</font>&nbsp;__name__ == &quot;<font color="#ffff00">__main__</font>&quot;:<br>
<font color="#ffff00">61 </font>&nbsp;&nbsp;&nbsp;&nbsp;test()<br>
</font></body>
</html>
zzzz zzzz
  • 307
  • 2
  • 13
  • Have you thought about making a new file and writing to that and then deleting the old file? If not, if you really wish to pursue inplace file editing, this answer here should help you: http://stackoverflow.com/questions/5453267/is-it-possible-to-modify-lines-in-a-file-in-place – Sandman May 28 '15 at 05:32
  • Oh, that's great. Can use ` for line in fileinput.input('test.txt'): print line.replace('zhipeng','#zhipeng'), fileinput.close()` but..how to seek line num? – zzzz zzzz May 28 '15 at 05:56
  • Count them with a variable. – Sandman May 28 '15 at 06:10

1 Answers1

0
# implement
def mark(ifn, ofn, linenum):
    with open(ifn, "rt") as ifile:
        with open(ofn, "wt") as ofile:
            n = 0
            for line in ifile.readlines():
                n = n + 1
                if n == linenum:
                    ofile.write("---")
                ofile.write(line)

# execute
mark("a.txt", "b.txt", 4)
dlask
  • 8,776
  • 1
  • 26
  • 30
  • What's the problem? This script doesn't load the *whole* file to memory, it works only on individual lines. Please note that file systems don't support in-place editing so one way or another, the proposed procedure finally appears somewhere, possibly hidden in layers of other code. – dlask May 28 '15 at 07:05
  • yeah, you're right, the can, and great, thank you very much! I'm only can't felt it's gorgeous .................... – zzzz zzzz May 28 '15 at 07:24