user1927396
user1927396

Reputation: 459

File operations failing

I am having the following issues in my code below,please provide inputs on where it is going wrong?

  1. change_ignore_base.txt and change_ignore_file.txt are not getting created,where is it going wrong?

  2. I see chagne_ignore has "\r" and "\n" appended,what is the smart way to strip off them and put them in a variable which can later be used to search.

change_ids.txt

206061
150362
147117
147441
143446
200912

change_ignore.txt

150362
147117
147441
143446
200914   

Code

import os
import subprocess
from subprocess import check_call

def sync (base_change):
    # open a file
    with open('change_ignore.txt') as f:
        change_ignore = f.readlines()
        print "change_ignore"
        print change_ignore

    with open('change_ids.txt') as f:
        lines = f.readlines()
        for line in lines:
            line=line.strip()
            print line
            if line <= base_change:
                print "IN line<=base_change"
                print line
                with open("change_ignore_base.txt", "a") as myfile:
                    myfile.write(line)
            if line in change_ignore:
                print "IN change_ignore"
                print line
                with open("change_ignore_file.txt", "a") as myfile:
                    myfile.write("line")
            if line > base_change and line not in change_ignore:
                pass


def main ():
    base_change=200913
    sync(base_change)

if __name__ == '__main__':
    main()

Upvotes: 1

Views: 89

Answers (1)

RocketDonkey
RocketDonkey

Reputation: 37249

Here is a mild adjustment to your program that I believe accomplishes what you want. Key points (as pointed out in the comments) are that you want to compare integers with integers, and that you should avoid opening/closing files multiple times (as was happening with the file appends inside the loop).

import os
import subprocess
from subprocess import check_call

def sync(base_change):

    # Generate a list of integers based on your change_ignore file
    with open('change_ignore.txt', 'rb') as f:
        # Here we make a list of integers based on the file
        change_ignore = [int(line.strip()) for line in f]

    # Store your hits/misses in lists; that way you do not
    # need to continuously open/close files while appending
    change_ignore_base = []
    change_ignore_file = []

    # Now open the file of the IDs
    with open('change_ids.txt', 'rb') as f:
        # Iterate over the file itself
        for line in f:
            # Convert the line to an integer (note that this
            # implicitly removes the newline characters)
            # However we are going to write 'line' to our list,
            # which will keep the newline (more on that later)
            num = int(line)
            print num

            # Now we are comparing ints with ints
            # I'm assuming the print statements are for debugging,
            # so we offset them with some space, making it so that
            # any relevant hits are indented under a number
            if num <= base_change:
                print "  IN line<=base_change"
                change_ignore_base.append(line)
            if num in change_ignore:
                print "  IN change_ignore"
                change_ignore_file.append(line)
            if num > base_change and num not in change_ignore:
                pass

    # Now that you have lists containing the data for your new files,
    # write them (they already have newlines appended so writelines works)
    # You can use 'with' with two files in this way in Python 2.7+,
    # but it goes over 80 characters here so I'm not a huge fan :)
    with open('change_ignore_base', 'wb') as b, open('change_ignore_file', 'wb') as f:
      b.writelines(change_ignore_base)
      f.writelines(change_ignore_file)


def main ():
    base_change=200913
    sync(base_change)

main()

This should create your files and print the following:

206061
150362
  IN line<=base_change
  IN change_ignore
147117
  IN line<=base_change
  IN change_ignore
147441
  IN line<=base_change
  IN change_ignore
143446
  IN line<=base_change
  IN change_ignore
200912
  IN line<=base_change

Upvotes: 1

Related Questions