0

私は次のスクリプト (以下を参照) を持っています。これは stdin に取り込まれ、いくつかの単純なファイルに操作されます。

# Import Modules for script
import os, sys, fileinput, platform, subprocess

# Global variables
hostsFile = "hosts.txt"
hostsLookFile = "hosts.csv"

# Determine platform
plat = platform.system()

if plat == "Windows":

# Define Variables based on Windows and process
    currentDir = os.getcwd()
    hostsFileLoc = currentDir + "\\" + hostsFile
    hostsLookFileLoc = currentDir + "\\" + hostsLookFile
    ipAddress = sys.argv[1]
    hostName = sys.argv[2]
    hostPlatform = sys.argv[3]
    hostModel = sys.argv[4]

    # Add ipAddress to the hosts file for python to process 
    with open(hostsFileLoc,"a") as hostsFilePython:
        for line in open(hostsFilePython, "r"):
            if ipAddress in line:
                print "ipAddress \(" + ipAddress + "\) already present in hosts file"
            else:
                print "Adding ipAddress: " + ipAddress + " to file"
                hostsFilePython.write(ipAddress + "\n")

    # Add all details to the lookup file for displaying on-screen and added value
    with open(hostsLookFileLoc,"a") as hostsLookFileCSV:
        for line in open(hostsLookFileCSV, "r"):
            if ipAddress in line:
                print "ipAddress \(" + ipAddress + "\) already present in lookup file"
            else:
                print "Adding details: " + ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + " to file"
                hostsLookFileCSV.write(ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + "\n")

if plat == "Linux":

# Define Variables based on Linux and process
    currentDir = os.getcwd()
    hostsFileLoc = currentDir + "/" + hostsFile
    hostsLookFileLoc = currentDir + "/" + hostsLookFile
    ipAddress = sys.argv[1]
    hostName = sys.argv[2]
    hostPlatform = sys.argv[3]
    hostModel = sys.argv[4]

    # Add ipAddress to the hosts file for python to process 
    with open(hostsFileLoc,"a") as hostsFilePython:
        print "Adding ipAddress: " + ipAddress + " to file"
        hostsFilePython.write(ipAddress + "\n")

    # Add all details to the lookup file for displaying on-screen and added value
    with open(hostsLookFileLoc,"a") as hostsLookFileCSV:
        print "Adding details: " + ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + " to file"
        hostsLookFileCSV.write(ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + "\n")

構文が間違っているため、このコードは明らかに機能しませんfor line in open(hostsFilePython, "r"):... 現在のファイル オブジェクトを " open()" で使用することはできません。しかし、これは私が達成したいことですが、どうすればこれを行うことができますか?

4

2 に答える 2

2

モードを使用a+てファイルを開き、読み取りと書き込みの両方ができるようにするには、既存のファイル オブジェクト ( hostsFilePython) を使用します。

ただし、使い果たされる前にファイルを 1 回しか反復処理できないため、これでも機能しません。

これはあまり効率的ではないことに注意してください。より良い計画は、データをセットに読み取り、新しい値でセットを更新してから、セットをファイルに書き込むことです。(コメントで指摘されているように、セットは重複を保持しません(目的に適しています)、順序は機能する場合と機能しない場合があります。そうでない場合は、リストを使用する必要がある場合がありますが、これは効率が低下します)。

于 2012-06-14T12:40:25.750 に答える
0
with open(hostsFileLoc) as hostsFilePython:
    lines = hostsFilePython.readlines()

for filename in lines:
    with open(hostsFileLoc, 'a') as hostFilePython:
        with open(filename) as hostsFile:
            for line in hostsFile.readlines():
                if ipAddress in line:
                   print "ipAddress \(" + ipAddress + "\) already present in hosts file"
                else:
                   print "Adding ipAddress: " + ipAddress + " to file"
                   hostsFilePython.write(ipAddress + "\n")

rデフォルトのモードは read であるため、明示的に渡す必要はありません。

于 2012-06-14T12:44:18.727 に答える