1

次のコードがあります。

inputActionFile = '../action.txt'
inputDaerahFile = '../daerah.txt'
inputStuffFile = '../stuff.txt'
inputTermsFile = '../terms.txt'

outputFile = 'hasil.out'

inputAction = open(inputActionFile, 'r')
inputDaerah = open(inputDaerahFile, 'r')
inputStuff = open(inputStuffFile, 'r')
inputTerms = open(inputTermsFile, 'r')

output = open(outputFile, 'w')

for actionLine in inputAction:
 for daerahLine in inputDaerah:
  for stuffLine in inputStuff:
   for termsLine in inputTerms:
    keyword = actionLine.strip() + ' ' + daerahLine.strip() + ' ' + stuffLine.strip() + ' ' + termsLine
    output.write(keyword)

inputAction.close()
inputDaerah.close()
inputStuff.close()
inputTerms.close()
output.close()

結果がこれらすべてのファイルをループし、それらを 1 つずつ出力ファイルにネストすることを期待していました。ただし、4 番目のループを繰り返すだけです。私は BaSH で同様のことを行っていましたが、Python でそれを行う方法を見たいと思っています。BaSH コードは次のとおりです。

#!/bin/sh
input1=$1
input2=$2
input3=$3
input4=$4
output=$5

echo "###START###" > $output
#old_IFS=$IFS
IFS='
'  # new field separator, EOL

for line1 in `cat $input1`;
do
 for line2 in `cat $input2`;
 do
  for line3 in `cat $input3`;
  do
   for line4 in `cat $input4`;
   do
    echo $line1 $line2 $line3 $line4 >> $output;
   done
  done
 done
done

unset IFS;
#IFS=$old_IFS
4

3 に答える 3

3

各ループは、ファイルを 1 回だけ通過します。ループスルーに成功した後

for termsLine in inputTerms:

一度、そこに到達するたびに、inputTerms ファイルの最後に到達したため、このループをスキップします。

各ループで各ファイルを再度開く (または少なくとも seek(0) する) か、ファイルをメモリ内のリストに読み込む必要があります。

したがって、次のいずれかです。

inputAction = open(inputActionFile, 'r').readlines()
inputDaerah = open(inputDaerahFile, 'r').readlines()
inputStuff = open(inputStuffFile, 'r').readlines()
inputTerms = open(inputTermsFile, 'r').readlines()

または:

for actionLine in open(inputActionFile, 'r'):
 for daerahLine in open(inputDaerahFile, 'r'):
  for stuffLine in open(inputStuffFile, 'r'):
   for termsLine in open(inputTermsFile, 'r'):
       etc....
于 2010-12-16T08:25:55.740 に答える
2

試す:

inputAction = open(inputActionFile, 'r').readlines()
inputDaerah = open(inputDaerahFile, 'r').readlines()
inputStuff = open(inputStuffFile, 'r').readlines()
inputTerms = open(inputTermsFile, 'r').readlines()
于 2010-12-16T07:50:23.700 に答える
0

これは、速度を上げる可能性のあるいくつかの変更を加えた Bash バージョンです (さらに、いくつかの変更が加えられています)。

#!/bin/bash
# you had sh, but your question tag says "bash"
# if you really need Bourne shell portability, you should have tagged your
# question "sh" and not "bash"

input1=$1
input2=$2
input3=$3
input4=$4
output=$5

echo "###START###" > $output
#old_IFS=$IFS

IFS=$'\n'  # new field separator, EOL

while read -r line1
do
    while read -r line2
    do
        while read -r line3
        do
            echo "$line1 $line2 $line3" | cat - "$input4"
        done < "$input3"
    done < "$input2"
done < "$input1"   >> "$output"

ファイルのサイズによっては、内側のforループを排除することで、これはあなたのバージョンよりもはるかに高速になる可能性がありinput4ます。最後にファイル書き込みを保存すると、速度がさらに向上する場合があります。

を行うことができwhile IFS=$'\n' read -r var、 の値を保存して復元する必要はありませんIFS(必要な場合) IFS。私のリビジョンでは)。

于 2010-12-16T15:49:03.843 に答える