0

スクリプトを機能させようとしています。このスクリプトでは、ルックアップcsvファイル内のIPの存在を確認し、存在する場合は3番目の要素を取得して、別の(2番目の)ファイルからその3番目の要素を削除します。これが私が持っているものの抜粋です:

for line in fileinput.input(hostsURLFileLoc,inplace =1):
        elements = open(hostsLookFileLoc, 'r').read().split(".").split("\n")
        first = elements[0].strip()
        third = elements[2].strip()
        if first == hostIP:
                if line != third:
                        print line.strip()

これは明らかに機能しません。いくつかのオプションで遊んでみましたが、これが私の最新の(クレイジーな)試みです。

問題は、2つの入力ファイルが同時に開いていることだと思います。

どんな考えでも歓迎します、

乾杯

4

3 に答える 3

5

わかりました、質問に対する私のコメントへの回答はありませんが、ここで一般的な回答を示します。何か問題がある場合は、そう言ってください。エラーに対処するために編集します。

まず、ここに私の仮定があります。2 つのファイルがあり、その名前がHostsLookFileLocおよびHostsURLFileLoc変数に格納されています。

のファイルHostsLookFileLocは CSV ファイルで、各行の 3 列目に IP アドレスがあります。このようなもの:

HostsLookFile.csv:

blah,blah,192.168.1.1,whatever,stuff
spam,spam,82.94.164.162,eggs,spam
me,myself,127.0.0.1,and,I
...

のファイルHostsURLFileLocは、次のように 1 行に 1 つの IP アドレスを持つフラット テキスト ファイルです。

HostsURLFile.txt:

10.1.1.2
10.1.1.3
10.1.2.253
127.0.0.1
8.8.8.8
192.168.1.22
82.94.164.162
64.34.119.12
...

目標はHostsURLFile.txt、CSV ファイルの行の 3 列目にあるすべての IP アドレスを除外して、ファイルを読み取ってから書き直すことです。上記のリストの例では、localhost (127.0.0.1) と python.org (82.94.164.162) は除外されますが、リスト内の残りの IP は残ります。

3つのステップでそれを行う方法は次のとおりです。

  1. CSV ファイルを読み取り、モジュールを使用して解析しcsv、IP アドレスを見つけます。それらをに貼り付けますset
  2. フラット ファイルを開き、IP アドレスを に読み込み、list後でファイルを閉じます。
  3. フラット ファイルを再度開いて、ロードされたアドレスのリストで上書きし、最初の手順のセットに含まれているものはすべてスキップします。

コード:

import csv

def cleanURLFile(HostsLookFileLoc, HostsURLFileLoc):
    """
    Remove IP addresses from file at HostsURLFileLoc if they are in
    the third column of the file at HostsLookFileLoc.
    """
    with open(HostsLookFileLoc, "r") as hostsLookFile:
        reader = csv.reader(hostsLookFile)
        ipsToExclude = set(line[2].strip() for line in reader)

    with open(HostsURLFileLoc, "r") as hostsURLFile:
        ipList = [line.strip() for line in hostsURLFile]

    with open(HostsURLFileLoc, "w") as hostsURLFile: # truncates the file!
        hostsURLFile.write("\n".join(ip for ip in ipList
                                     if ip not in ipsToExclude))

このコードは意図的に単純化されています。ユースケースにとって重要な場合は、改善できることがいくつかあります。

  • 書き換えステップ中に何かがプログラムをクラッシュさせた場合、HostsURLFile.txt が破壊される可能性があります。(少なくとも、Unix スタイルのシステムでは) 書き換えるより安全な方法は、一時ファイルに書き込み、書き込みが完了した (そしてファイルが閉じられた) 後、古いファイルの上に一時ファイルの名前を変更することです。そうすれば、プログラムがクラッシュした場合でも、元のバージョンまたは完全に作成された代替バージョンを引き続き使用できますが、その間には何もありません.
  • 必要なチェックがセット メンバーシップよりも複雑な場合は、実際の処理を行うために 2 と 3 の間に追加の手順を追加し、それ以上の操作を行わずに (改行を追加する以外は) 結果を書き出します。
  • 改行といえば、末尾に改行がある場合、IP アドレスのリストに空の文字列として渡されますが、このシナリオでは問題ありません (除外する IP のセットには含まれません。 CSV ファイルの行がめちゃくちゃになっています) が、より複雑なことを行うと問題が発生する可能性があります。
于 2012-07-26T04:55:33.237 に答える
0

最初のファイルで2番目のファイルで削除する必要のある値を見つけたら、次のような擬似コードを提案します。

Load first file into memory
Search string representing first file for matches using a regular expression
    (in python, check for re.find(regex, string), where regex = re.compile("[0-9]{3}\\.[0-9]{3}\\.[0-9]\\.[0-9]"), I am not entirely certain that you need the double backslash here, try with and without)
Build up a list of all matches
Exit first file

Load second file into memory
Search string representing second file for the start index and end index of each match
For each match, use the expression string = string[:start_of_match] + string[end_of_match:]
Re-write the string representing the second (now trimmed) file to the second file

基本的に、一致するものが見つかったら、新しい文字列の割り当てから除外して、文字列をその両側のスライスになるように再定義します。次に、文字列をファイルに書き換えます。

于 2012-07-25T01:08:01.490 に答える
0

テストファイルtest.csv(そこにIPアドレスがあることに注意してください):

'aajkwehfawe;fh192.168.0.1awefawrgaer'

(今のところCSVであることをほとんど無視しています。正規表現の一致を使用するだけです。)

# Get the file data
with open('test.csv', 'r') as f:
    data = f.read()

# Look for the IP:
find_ip = '192.168.0.1'
import re
m = re.search('[^0-9]({})[^0-9]'.format(find_ip), data)
if m: # found!
    # this is weird, because you already know the value in find_ip, but anyway...
    ip = m.group(1).split('.')
    print('Third ip = ' + ip[2])
else:
    print('Did not find a match for {}'.format(find_ip))

私はあなたの質問の2番目の部分、つまり2番目のファイルから3番目の値を削除することを理解していません。行ごとにリストされている番号がありますか?上記の番号を含む行を見つけて、その行を削除しますか?はいの場合:

# Make a new list of lines that omits the matched one
new_lines=[]
for line in open('iplist.txt','r'):
    if line.strip()!=ip[2]: # skip the matched line
        new_lines.append(line)

# Replace the file with the new list of lines
with open('iplist.txt', 'w') as f:
    f.write('\n'.join(new_lines))
于 2012-07-24T23:32:18.030 に答える