2012-05-08 17 views
26

これを行う方法はありますか?ラインで、 Pythonでファイルの途中に行を挿入しますか?

  • ビル
  • ドナルド私は第三の名前を挿入することができる方法
  • 、「チャーリー」

    1. アルフレッド:私はこのように書きます名前のリストだファイルを持っていると言いますx(この場合は3)、自動的に他のすべてを1行下に送りますか?私はこのような他の質問を見たことがありますが、彼らは役に立つ答えを得ていませんでした。それはできればメソッドかループのどちらかで行うことができますか?

    +0

    私は、いくつかの基本的な研究でこれに対する解決策を見つけることはできません。あなたはそれをしてもよろしいですか? –

    +2

    @AbhranilDas私はすぐにこの答えを見つけたtkbxの良い言い回しのおかげで! – dmeu

    +0

    related:[テキストファイルの中身を読んでいるときに、テキストファイルの途中に書き込むにはどうすればいいですか?](0120-18753) – jfs

    答えて

    39

    これはトリックを行う方法です。

    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

    +4

    これはおそらく私の答えより少しきれいですが、ファイルを2回開いたり閉じたりするのを避けることができます。 – jordanm

    +4

    自分で参加するのではなく、 'f.writelines(contents)'を使うほうが簡単でしょうか? – zekel

    +0

    contents.insert(x、y)i like this、simple –

    2
    1. はあなたの基準に従って、新しい行を挿入する必要が位置を特定file.readlines()file.read().split('\n')
    2. を使用してPythonのリストにファイルを解析します。
    3. list.insert()を使用して新しいリスト要素を挿入します。
    4. 結果をファイルに書き込みます。
    +3

    'file.read.split( '\ split( '\ n') ' – Harry

    5

    から始めて、お好みのラインと価値あります。

    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])) 
    
    4

    あなたはとても一つの可能​​な解釈は、あなたが出力としてこれをしたいということで、出力がどのように見えるか、私たちは表示されません。

    1. アルフレッド
    2. ビル
    3. チャーリー
    4. Donald

    (チャーリーを挿入してから1後続のすべての行に)ここに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() 
    
    11

    あなたは、サブストリングのためのファイルを検索し、次の行に新しいテキストを追加したい場合は、それを行うには、エレガントな方法の一つは次のとおりです。

    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, 
    
    +4

    python3では 'print(line、end = '')'は行間に改行を挿入しないようにするのに便利です。 –

    1

    私はこの問題を解決する上で有用であることが分かっ技術の組み合わせがあります:私たちの特定のアプリケーションで

    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の後に複数のコピーを追加することができないため、繰り返し実行することもできます。

    関連する問題