我正在尝试读取两个文件,并在 Python (2.7.3) 上比较它们
它们的大小/顺序不同,因为我正在使用 ID/名称,它们不会“匹配”。
而且我不想同时阅读它们,而是“file2”彻底并与“file1”的每一行进行比较,然后再读取“file1”的另一行,依此类推
从我所做的来看,它工作得不好,有一些问题。
例如,看这段代码:
if split_cronus[0] == split_data[0]:
程序执行'if'中的所有内容,然后退出。
如果我再次调用该函数,之后:
print final_line + "\n"
它将工作 62 次,然后显示此错误:
Traceback (most recent call last):
File "C:\Users\Matheus\Desktop\DBWolfmizator\DBWolfmizator\DBWolfmizator.py", line 40, in <module>
File "C:\Users\Matheus\Desktop\DBWolfmizator\DBWolfmizator\DBWolfmizator.py", line 28, in translate_itemdb
translate_itemdb()
每次程序循环时都会显示“第 28 行”错误。
进而:
File "C:\Users\Matheus\Desktop\DBWolfmizator\DBWolfmizator\DBWolfmizator.py", line 15, in translate_itemdb
for line2 in data:
ValueError: I/O operation on closed file
这意味着,有了“if”,我只能得到一个匹配项,就像文件只有一行一样;但是通过递归,我可以让它在第二个文件结束之前再工作几次。
如果你不明白:
我必须阅读两个文件。
"file1" 和 "file2"
理论上,它的读法是这样的:
file1_line1 -> file2_line1
file1_line1 -> file2_line2
file1_line1 -> file2_line3
...
file1_line2 -> file2_line1
file1_line2 -> file2_line1
...
但是当我得到匹配时,程序退出循环。
我怎么做?
在 PHP 中它工作得很好,我试图制作类似“端口”的东西。
Python代码:
cronus = open("item_db.txt", "r+")
data = open("idnum2itemdisplaynametable.txt", 'r')
new_item = open("item_db_new.txt", 'w')
def translate_itemdb():
try:
try:
for line in cronus:
if line.startswith("//") or len(line) < 3:
new_item.write(line)
continue
split_cronus = str.split(line, ",")
del split_cronus[len(split_cronus) - 1]
for line2 in data:
if line2.startswith("//") or len(line2) < 3:
continue
split_data = str.split(line2, "#")
del split_data[len(split_data) - 1]
if split_cronus[0] == split_data[0]:
split_cronus[1] = str.replace(split_data[1], " ", "_")
split_cronus[2] = str.replace(split_data[1], "_", " ")
final_line = ','.join(split_cronus)
new_item.write(final_line + "\n")
print final_line + "\n"
finally:
cronus.close()
data.close()
new_item.close()
except IOError:
raise
return
translate_itemdb()
PHP代码:
<?php
set_time_limit(0);
$Cronus = file('item_db.txt');
$Data = file('idnum2itemdisplaynametable.txt');
for( $i = 0; $Cronus[$i]; $i++ ) {
if( $Cronus[$i][0] == '/' || strlen($Cronus[$i]) < 3 ) {
echo $Cronus[$i]."<br />";
continue;
}
$ExplodeCronus = explode( ',', $Cronus[$i] );
for( $j = 0; @$Data[$j]; $j++ ) {
if( $Data[$j][0] == '/' || strlen($Data[$j]) < 3 )
continue;
$ExplodeData = explode( '#', $Data[$j] );
if( $ExplodeData[0] == $ExplodeCronus[0] ) {
$ExplodeCronus[1] = str_replace( " ", "_", $ExplodeData[1] );
$ExplodeCronus[2] = str_replace( "_", " ", $ExplodeData[1] );
$Linha = implode( ',', $ExplodeCronus );
echo $Linha."<br />";
}
}
}
?>