2017-01-22 14 views
-3

番号を交換使用して以下のような文字が()私は1 として、それを交換したい10の場合... マイデータラインは、このPythonのチェックと私はPythonで初心者です

2015-04-18 10 101011 
2015-04-18 10 102000 
2015-04-18 20 222222 
2015-04-18 20 100000 

のように見えます及び2は20

2015-04-18 10 101011 to 2015-04-18 1 101011 
2015-04-18 20 101011 to 2015-04-18 2 101011 

iはラインによって各ラインを読み出した場合

with open("test.txt",'r') as f: 

file = f.readlines() 
for each in file: 

ここにif文を与える方法は...

+0

以上のコードの開始よりも私たちをご提示ください。広すぎます。 –

+1

正規表現を使用しますか?スペースを分割して2番目の値を確認しますか? 12番目と13番目の文字を確認しますか? *何か試しましたか?* – jonrsharpe

+0

2番目の強調表示されたテキストは括弧で囲まれた10と20ですが、最初に強調表示されたテキストは表示されません。どちらですか?インデントが正しくないため、最後に強調表示されたテキストのコードは機能しません。あなたのテキストの置き換えはあなたのファイルのサイズを変更します:それはあなたが望むものですか?あなたはこれまでにこの問題について何を試しましたか?あなたの質問を改善してください。 –

答えて

1

正規表現はこれには可能ですが残酷かもしれません。ここでsplit()を使用したソリューションです:

DATA =\ 
"""2015-04-18 10 101011 
2015-04-18 10 102000 
2015-04-18 20 222222 
2015-04-18 20 100000""" 

def process_data(data): 
    substitutions = {'10':'1', '20':'2', '30':'3'} 
    for line in data.splitlines(): 
     components = line.split() 
     components[1] = substitutions[components[1]] 
     yield ' '.join(components) 

if __name__ == '__main__': 
    for line in process_data(DATA): 
     print(line) 

出力

2015-04-18 1 101011 
2015-04-18 1 102000 
2015-04-18 2 222222 
2015-04-18 2 100000 

仮定

私は「あなたはあなたの質問から明らかにされていない細部の数がありますのでこの実装で行った前提をリストアップします:

  • データの各行には少なくとも1つのスペースがあります(そうでない場合はcomponents[1]IndexErrorを発生させます)。
  • 最初のスペースに続くデータは、「10」または「20」のいずれかになり、その後に別のスペースが続きます。
  • 各行のすべての空白の区切りは、の単一ののスペースです。 Otherwise ' '.join(components)は、オリジナルとは異なる間隔の線を生成します。

入力(「10」と「20」)とそれらの置換(「1と2」)の関係については、想定されていません。この非常に小さなデータセットからはf(x) = x/10のように見えますが、確かに分かります。必要に応じて、ユースケースに従って置換ロジックを調整できます。

+0

'components [1] = substitutions [components [1]] 'が不明の場合、クラッシュします。私は 'components [1] + =" 0 "' –

+0

@ Jean-FrançoisFabreに一般化しようとしています。 OPは入力とその置換の関係を明示的には明示しておらず、おそらく "30"は "5"の代わりに "5"にマップする必要があります。この2つのデータポイントからパターンを推測しているので、 3 "となる。 – Tagc

+0

その理由は、その質問があまり「人気がある」というわけではありません:)あなたの仮説を説明する必要があります。 –

1

置換コールバックre.sub機能を使用してソリューション:

def shortenDigits(m): 
    d = {'10': '1', '20': '2', '30': '3'} 
    val = m.group(2) 
    return m.group(1) + (val if val not in d else d[val]) 

with open('test.txt', 'r') as fh: 
    lines = fh.readlines() 
    replaced = [re.sub(r'^(\d{4}-\d{2}-\d{2})(\d{2})', shortenDigits, l) for l in lines] 

print(replaced) 

出力:

['2015-04-18 1 101011\n', '2015-04-18 1 102000\n', '2015-04-18 2 222222\n', '2015-04-18 2 100000\n'] 
+0

私は最初に 're.sub'を使うことを考えていましたが、マッチ自体に依存する置換のためにどのように使用するのかは分かりませんでした。これは私にどのように教えた。 – Tagc

関連する問題