1

入力:

!,A,56281,12/12/19,19:34:12,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/1
2/19,19:34:13,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34:14,000.
0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34:15,000.0,0,37N22.714,121W
55.576,+0013!,A,56281,12/12/19,19:34:16,000.0,0,37N22.714,121W55.576,+0013!,A,56
281,12/12/19,19:34:17,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34
:18,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34:19,000.0,0,37N22.

出力:

!,A,56281,12/12/19,19:34:12,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:13,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:14,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:15,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:16,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:17,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:18,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:19,000.0,0,37N22.

'!' は開始文字であり、+ 0013は各行の終了である必要があります(存在する場合)。

私が得ている問題:出力は次のようなものです:

!,A,56281,12/12/19,19:34:12,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/1
2/19,19:34:13,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:14,000.
0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:15,000.0,0,37N22.714,121W

どんな助けでも大歓迎です...!!!

私のコード:

file_open= open('sample.txt','r') 
file_read= file_open.read() 
file_open2= open('output.txt','w+') 
counter =0 
for i in file_read: 
    if '!' in i: 
        if counter == 1: 
            file_open2.write('\n') 
            counter= counter -1 
        counter= counter +1 
    file_open2.write(i)
4

6 に答える 6

2

次のようなことを試すことができます:

with open("abc.txt") as f:
    data=f.read().replace("\r\n","")  #replace the newlines with ""

    #the newline can be "\n" in your system instead of "\r\n"

    ans=filter(None,data.split("!"))  #split the data at '!', then filter out empty lines
    for x in ans:
        print "!"+x    #or write to some other file
   .....:         
!,A,56281,12/12/19,19:34:12,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:13,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:14,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:15,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:16,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:17,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:18,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:19,000.0,0,37N22.
于 2013-01-18T21:05:33.990 に答える
1

使っていただけませstr.splitんか?

lines = file_read.split('!')

現在、 lines は分割されたデータを保持するリストです。'!'これはほとんどあなたが書きたい行です - 唯一の違いは、末尾に改行がなく、先頭にないことです。これらは、文字列の書式設定で簡単に入れることができます'!{0}\n'.format(line)。次に、そのすべてをジェネレーター式file.writelinesに入れ、データを新しいファイルに入れるために渡します。

file_open2.writelines('!{0}\n'.format(line) for line in lines)

次のものが必要になる場合があります。

file_open2.writelines('!{0}\n'.format(line.replace('\n','')) for line in lines)

出力に必要以上の改行が含まれていることがわかった場合。

その他のいくつかの点として、ファイルを開くときは、コンテキスト マネージャーを使用すると便利です。これにより、ファイルが適切に閉じられるようになります。

with open('inputfile') as fin:
    lines = fin.read()
with open('outputfile','w') as fout:
    fout.writelines('!{0}\n'.format(line.replace('\n','')) for line in lines)
于 2013-01-18T21:05:23.490 に答える
1

多少の違いがありますが、正規表現の回答は次のとおりです。

import re

outputFile = open('output.txt', 'w+') 
with open('sample.txt', 'r') as f: 
    for line in re.findall("!.+?(?=!|$)", f.read(), re.DOTALL): 
        outputFile.write(line.replace("\n", "") + '\n') 

outputFile.close() 

出力ファイルを開き、入力ファイルの内容を取得!.+?(?=!|$)し、re.DOTALLフラグを指定した正規表現を使用してすべての一致をループします。正規表現の説明と一致するものは、http: //regex101.com/r/aK6aV4にあります。

一致した後、一致から新しい行を取り除き、それをファイルに書き込みます。

于 2013-01-18T21:39:04.940 に答える
1

replace各行の開始文字と終了文字がわかっているため、分割の代わりに使用する別のオプション:

In [14]: data = """!,A,56281,12/12/19,19:34:12,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/1
2/19,19:34:13,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34:14,000.
0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34:15,000.0,0,37N22.714,121W
55.576,+0013!,A,56281,12/12/19,19:34:16,000.0,0,37N22.714,121W55.576,+0013!,A,56
281,12/12/19,19:34:17,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34
:18,000.0,0,37N22.714,121W55.576,+0013!,A,56281,12/12/19,19:34:19,000.0,0,37N22.""".replace('\n', '')

In [15]: print data.replace('+0013!', "+0013\n!")
!,A,56281,12/12/19,19:34:12,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:13,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:14,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:15,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:16,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:17,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:18,000.0,0,37N22.714,121W55.576,+0013
!,A,56281,12/12/19,19:34:19,000.0,0,37N22.
于 2013-01-18T21:10:39.900 に答える
0

ファイルのコンテンツ全体ではなく、データ ストリームで作業できるように、実際にジェネレーターとして実装します。巨大なファイルを扱う場合、これは非常にメモリに優しいでしょう

>>> def split_on_stream(it,sep="!"):
    prev = ""
    for line in it:
        line = (prev + line.strip()).split(sep)
        for parts in line[:-1]:
            yield parts
        prev = line[-1]
    yield prev


>>> with open("test.txt") as fin:
    for parts in split_on_stream(fin):
        print parts



,A,56281,12/12/19,19:34:12,000.0,0,37N22.714,121W55.576,+0013
,A,56281,12/12/19,19:34:13,000.0,0,37N22.714,121W55.576,+0013
,A,56281,12/12/19,19:34:14,000.0,0,37N22.714,121W55.576,+0013
,A,56281,12/12/19,19:34:15,000.0,0,37N22.714,121W55.576,+0013
,A,56281,12/12/19,19:34:16,000.0,0,37N22.714,121W55.576,+0013
,A,56281,12/12/19,19:34:17,000.0,0,37N22.714,121W55.576,+0013
,A,56281,12/12/19,19:34:18,000.0,0,37N22.714,121W55.576,+0013
,A,56281,12/12/19,19:34:19,000.0,0,37N22.
于 2013-01-19T08:39:52.420 に答える
0

\nすべての "!" の前にa を追加してみましょう。次に、python分割行を許可します:-) :

file_read.replace("!", "!\n").splitlines()
于 2013-01-18T21:09:42.037 に答える