从文件中读取的Python嵌套循环
我有以下代码:
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()
我本来希望这个代码能遍历所有这些文件,并把它们一个一个地嵌套到输出文件里。然而,它只执行了第四个循环。我之前在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
3 个回答
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
(我在我的修改中也这样做了)。
2
试试:
inputAction = open(inputActionFile, 'r').readlines()
inputDaerah = open(inputDaerahFile, 'r').readlines()
inputStuff = open(inputStuffFile, 'r').readlines()
inputTerms = open(inputTermsFile, 'r').readlines()
3
每次循环只会遍历文件一次。在成功遍历完
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....