在python中读取两个文件
我试图读取两个文件,并在Python(2.7.3)上比较它们在python中读取两个文件,python,file-io,for-loop,iteration,Python,File Io,For Loop,Iteration,我试图读取两个文件,并在Python(2.7.3)上比较它们 它们的大小/顺序不同,因为我使用的是ID/名称,它们不会“匹配” 我不想同时读它们,但“file2”要彻底,并与“file1”的每一行进行比较,然后再读另一行“file1”,以此类推 从我所做的来看,它工作得很差,有一些问题。 例如,看看这段代码: if split_cronus[0] == split_data[0]: 程序执行“如果”中的所有内容,然后退出。 如果我再次调用该函数,则在以下情况下: print final_l
它们的大小/顺序不同,因为我使用的是ID/名称,它们不会“匹配” 我不想同时读它们,但“file2”要彻底,并与“file1”的每一行进行比较,然后再读另一行“file1”,以此类推 从我所做的来看,它工作得很差,有一些问题。
例如,看看这段代码:
if split_cronus[0] == split_data[0]:
程序执行“如果”中的所有内容,然后退出。
如果我再次调用该函数,则在以下情况下:
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()
也就是说,如果有“if”,我只能得到一个匹配项,就像文件只有一行一样;但是使用递归,我可以在第二个文件结束之前让它再工作几次。
如果您不明白:
我必须读两个文件。
“文件1”和“文件2”
理论上,它是这样读的:
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()
cronus=open(“item_db.txt”,“r+”)
数据=打开(“idnum2itemdisplaynametable.txt”,“r”)
new\u item=open(“item\u db\u new.txt”,“w”)
def translate_itemdb():
尝试:
尝试:
对于cronus中的行:
如果第行以(“/”)开头或第(行)行小于3:
新建项目。写入(行)
持续
split_cronus=str.split(行“,”)
del split_cronus[len(split_cronus)-1]
对于数据中的第2行:
如果第2行开始于(“/”)或第2行小于3:
持续
split_data=str.split(第2行,“#”)
删除分割数据[len(分割数据)-1]
如果split_cronus[0]==split_data[0]:
split_cronus[1]=str.replace(split_data[1]、“”、“u2;”)
split_cronus[2]=str.replace(split_data[1],“u”,”)
最后一行=','。连接(拆分)
新建项目。写入(最后一行+“\n”)
打印最后一行+“\n”
最后:
cronus.close()
data.close()
新建_项。关闭()
除IOError外:
提升
返回
翻译_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 />";
}
}
}
?>
一种修复方法是移动此行:
data = open("idnum2itemdisplaynametable.txt", 'r')
for line2 in data:
在这一行之前:
data = open("idnum2itemdisplaynametable.txt", 'r')
for line2 in data:
这样,您可以根据需要重新打开数据文件。(根据需要调整异常处理以关闭数据文件。考虑使用<代码> < /COD>)
其次,为了更接近您发布的PHP代码,可以使用readlines
。毕竟,您正在多次读取该文件。只需一次阅读所有内容,然后进行处理
因此,将数据打开代码保留在原处,您可以执行以下操作:
data_f = open("idnum2itemdisplaynametable.txt", 'r')
data = data_f.readlines()
然后,数据中第2行的
循环只是重新访问一个行数组。一种修复方法是移动此行:
data = open("idnum2itemdisplaynametable.txt", 'r')
for line2 in data:
在这一行之前:
data = open("idnum2itemdisplaynametable.txt", 'r')
for line2 in data:
这样,您可以根据需要重新打开数据文件。(根据需要调整异常处理以关闭数据文件。考虑使用<代码> < /COD>)
其次,为了更接近您发布的PHP代码,可以使用readlines
。毕竟,您正在多次读取该文件。只需一次阅读所有内容,然后进行处理
因此,将数据打开代码保留在原处,您可以执行以下操作:
data_f = open("idnum2itemdisplaynametable.txt", 'r')
data = data_f.readlines()
然后,您的数据中第2行的循环只是重新访问一个行数组。好吧,我会这样做来比较两个文件:
def compare_two_files(filename1, filename2):
input1 = open(filename1)
input2 = open(filename2)
lines1 = input1.readlines()
lines2 = input2.readlines()
# Iterate over the two files
for l1 in lines1:
cur_l1 = l1.split(',')
for l2 in lines2:
cur_l2 = l2.split(',')
# Compare file's lines
if cur_l1[0] == cur_l2[0]:
print('something')
我没有测试它,但它应该可以工作。好吧,我会做一些类似的事情来比较两个文件:
def compare_two_files(filename1, filename2):
input1 = open(filename1)
input2 = open(filename2)
lines1 = input1.readlines()
lines2 = input2.readlines()
# Iterate over the two files
for l1 in lines1:
cur_l1 = l1.split(',')
for l2 in lines2:
cur_l2 = l2.split(',')
# Compare file's lines
if cur_l1[0] == cur_l2[0]:
print('something')
我没有测试它,但它应该可以工作。此外,我的直觉是,您的代码中可能存在其他错误和低效-我只关注了让您前进的主要和最简单的更改。:-)非常感谢你!现在它工作得很好。我将研究“with”和file.readlines():)另外,我的直觉是,您的代码中可能存在其他错误和低效-我只关注了让您继续前进的主要和最简单的更改。:-)非常感谢你!现在它工作得很好。我将研究“with”和file.readlines():)