5

だから私がやりたいことは比較的単純に思えますが、私の人生では、それを完全に理解することはできません. 次のような.txtファイルがあります

4 2
6 5 1
9 4 5

そして、その情報を利用できるようにしたい (つまり、必要でない限り、新しい .txt ファイルを作成する必要はありません)...

3 1
5 4 0
8 3 4

または、1すべての数値から減算されますが、書式設定は同じままです。元の数値よりも大きい数値は存在1しないため、負数は使用できません。0この全体的な頭痛の種は、代わりにインデックス作成を最初から変換することによるものです1。物事を複雑にする可能性があるのは、元のファイルが次のように印刷されることです

['4 2 /n','6 5 1 /n', '9 4 5 /n']

私がしたこと

それは私が StackOverflow で見つけたさまざまなものの寄せ集めですが、可能な限り最も面倒な方法でそれを行っていると思います。そして、これは私が実装したときに意味がありませんでした..スペースの問題と同じ軌道に乗っているかもしれませんが..

origianl = open(file, 'r')
for line in original.readlines():
    newline = line.replace(" \n","")
    finalWithStrings.append(newline)

finalWithIntegers = [map(int,x) for x in finalWithStrings]
finalWithIntegers[:] = [x-1 for x in finalWithIntegers]

私の思考プロセスは、「/n」を削除し、これらの文字列を整数に変換して1、それらから減算できるようにする必要があるというものでした。そして、どういうわけかフォーマットを維持します。各行には、別のファイルの同様に索引付けされた行に関する情報が含まれているため、フォーマットを同じにすることが重要です。最終結果 (または print ステートメント) に "/n" を表示したくありませんが、改行の効果が必要です。ただし、上記のコードは 2 つの理由 (私が知っている) で機能しません。

int(n[:])スペースが気に入らないためエラーがスローされ、そこに値(たとえば0)を入力すると、コードは各行に最初の数字を出力し、1を減算します..そしてすべてを1行に配置します。

[3, 5, 8]

したがって、キャリッジ リターンを取り出して別のキャリッジ リターンを挿入するのは冗長に思えますが、すべての数値を取得する方法だけでなく、書式を維持する必要もあります。

これもうまくいきませんでした:

for line in original.readlines():
    newline = line.replace(" \n","")
    finalWithStrings.append(newline)

finalWithIntegers = [map(int,x) for x in finalWithStrings]
finalWithIntegers[:] = [x-1 for x in finalWithIntegers]    

しかし、間違った出力ではなく、エラーでした:

ValueError:invalid literal for int() with base 10:''

ここで私が間違っていることと、これを修正する方法について誰か考えがありますか? 私は Python 2.6 を使用しており、初心者です。

4

4 に答える 4

9
with open("original_filename") as original:
    for line in original:
        #if you just want the line as integers:
        integers = [ int(i) - 1 for i in line.split() ]
        #do something with integers here ...

        #if you want to write a new file, use the code below:
        #new_line = " ".join([ str(int(i) - 1) for i in line.split() ])
        #newfile.write(new_line + '\n')

上記の例では、ファイルをコンテキスト マネージャーで開いています。これは良い方法です (バージョン 2.5 以降)。コンテキスト マネージャーは、そのコンテキストを終了するときに、ファイルが適切に閉じられていることを確認します。

編集

2D リストを作成しようとしているように見えます...そのためには、次のようにします。

data = []
with open("original_filename") as original:
    for line in original:
        integers = [ int(i) - 1 for i in line.split() ]
        data.append(integers)

または、ワンライナーを好む場合 (私は好みません):

with open("original_filename") as original:
    data = [ [int(i) for i in line.split()] for line in original ]

これを印刷すると、次のようになります。

for lst in data:
    print (lst)    # [3, 1]
                   # [5, 4, 0]
                   # [8, 3, 4]
于 2012-08-03T17:32:46.550 に答える
4

これは、正規表現を使用してこれを実現する非常に簡単な方法です。ここでの利点は、空白に触れずに数値を置き換えるため、書式設定がまったく同じままであることが保証されることです。

import re

def sub_one_repl(match):
    return str(int(match.group(0))-1)

for line in original.readlines():
    newline = re.sub(r'\d+', sub_one_repl, line).rstrip('\n')
于 2012-08-03T17:39:11.323 に答える
2

もう 1 つの方法は、csv モジュールとリスト内包表記を使用することです。

from csv import reader

data = [[int(j) - 1 for j in i] for i in reader(open("your_file"), delimiter=' ')]

たとえば、データを使用すると、次のようになります。

[[3, 1], [5, 4, 0], [8, 3, 4]]
于 2012-08-03T18:00:43.333 に答える
0

これを試して:

with open(filepath) as f:
    for line in f:
        print " ".join([str(int(i)-1) for i in line.split()])

それが役立つことを願っています

于 2012-08-03T17:43:39.027 に答える