【问题标题】:Reading two files in python在python中读取两个文件
【发布时间】:2012-08-08 00:14:52
【问题描述】:

我正在尝试读取两个文件,并在 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 />";
        }
        }
    }
?>

【问题讨论】:

    标签: python file-io for-loop iteration


    【解决方案1】:

    一种解决方法是移动这条线:

       data = open("idnum2itemdisplaynametable.txt", 'r')
    

    到此行之前:

       for line2 in data:
    

    这样您可以根据需要重新打开数据文件。 (根据需要调整异常处理以关闭数据文件。考虑使用with。)

    其次,为了更接近您发布的 PHP 代码,您可以使用readlines。毕竟,您正在多次阅读该文件。只需一次阅读它们即可开始,然后进行处理。

    因此,将数据打开代码留在原处,您可以这样做:

       data_f = open("idnum2itemdisplaynametable.txt", 'r')
       data = data_f.readlines()
    

    那么您的 for line2 in data 循环只是重新访问一组行。

    【讨论】:

    • 另外,我的直觉是您的代码中可能存在其他错误和效率低下 - 我只是专注于使您前进的主要和最简单的更改。 :-)
    • 非常感谢!现在它工作得很好。我将研究“with”和 file.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')
    

    我没有测试它,但它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多