在 Python 中使用带有命令行参数的 open()

Using open() with Command Line Argument in Python

我知道我遗漏了一些明显的东西。我正在使用 argparse 来解析两个输入文件。当我打印变量 'file1' 和 'file2'

时,我从主函数得到了预期的输出

但是我尝试在子函数中使用 'file1' 和 'file2'。我还尝试打印出新变量(失败)。我想要做的是将命令行参数设置为变量,然后稍后在代码中使用这些变量。

"""
Created on Fri Oct 21 12:02:34 2016

@author: jsklein
"""
import pandas as pd
import csv
import argparse

# Parse command line arguments and set them to variables to be used later
def main():
    parser = argparse.ArgumentParser(description='Compares Two CSV files for matches and differences indexed on a column')

    parser.add_argument("-i", help="Name of first CSV import file", action="store", dest="infile1", required="yes")
    parser.add_argument("-I", help="Name of second CSV import file", action="store", dest="infile2", required="yes")

    args = parser.parse_args()    
    file1 = args.infile1
    file2 = args.infile2
    print(file1)
    print(file2)
# Define Compare funtion that joins on specified column

    def merge_csvs():
        a = pd.read_csv(file1)
        b = pd.read_csv(file2)
        print(a)
        print(b)

        merged = b.merge(a, on='SWREV')
        merged.to_csv("merged_results.csv", index=False) 

 # Define Diff function that diffs on specified column

    def diff_csvs():
        s = open(file1, 'r')
        k = open(file2, 'r')
        print(s)
        print(k)

        checkS = csv.reader(s)
        checkK = csv.reader(k)

        output1 =  [row for row in checkS if row not in checkK]
        output2 =  [row for row in checkK if row not in checkS]

        with open("A_notin_B.csv", "w") as f:
            writer = csv.writer(f)
            writer.writerows(output1)

        with open("B_notin_A.csv", "w") as l:
            writer = csv.writer(l)
            writer.writerows(output2)

# Main Function that Calls all the other functions


main()

这里是运行代码的例子,注意其他变量'a'、'b'、's'和'k'不打印(是的,我期待很多输出:

$ python csv_compare.py -i csv1.csv -I csv2.csv
csv1.csv
csv2.csv

我不确定,但也许这会有所帮助(如果这是您想要做的):

import pandas as pd
import csv
import argparse

# Parse command line arguments and set them to variables to be used later
def main():
    parser = argparse.ArgumentParser(description='Compares Two CSV files for matches and differences indexed on a column')

    parser.add_argument("-i", help="Name of first CSV import file", action="store", dest="infile1", required="yes")
    parser.add_argument("-I", help="Name of second CSV import file", action="store", dest="infile2", required="yes")

    args = parser.parse_args()    
    file1 = args.infile1
    file2 = args.infile2
    print(file1)
    print(file2)

    # explicitly call the other functions
    merge_csvs(file1,file2)
    diff_csvs(file1,file2)

# Define Compare funtion that joins on specified column
def merge_csvs(file1,file2):
    a = pd.read_csv(file1)
    b = pd.read_csv(file2)
    print(a)
    print(b)

    merged = b.merge(a, on='SWREV')
    merged.to_csv("merged_results.csv", index=False) 

# Define Diff function that diffs on specified column
def diff_csvs(file1,file2):
    s = open(file1, 'r')
    k = open(file2, 'r')
    print(s)
    print(k)

    checkS = csv.reader(s)
    checkK = csv.reader(k)

    output1 =  [row for row in checkS if row not in checkK]
    output2 =  [row for row in checkK if row not in checkS]

    with open("A_notin_B.csv", "w") as f:
        writer = csv.writer(f)
        writer.writerows(output1)

    with open("B_notin_A.csv", "w") as l:
        writer = csv.writer(l)
        writer.writerows(output2)

# Main Function that Calls all the other functions
main()

基本上我所做的是:

  • 在 main() 方法之外定义函数

  • 添加 file1 和 file2 作为参数

  • 从 main() 调用这两个函数,为每个调用提供 file1 和 file2 作为参数

上面发布的代码未经测试。我刚刚编辑了你的代码

# -*- coding: utf-8 -*-
"""
Created on Fri Oct 21 12:02:34 2016

@author: jsklein
"""
import pandas as pd
import csv
import argparse

# Parse command line arguments and set them to variables to be used later
parser = argparse.ArgumentParser(description='Compares Two CSV files for       matches and differences indexed on a column')

parser.add_argument("-i", help="Name of first CSV import file", action="store", dest="infile1", required="yes")
parser.add_argument("-I", help="Name of second CSV import file", action="store", dest="infile2", required="yes")

args = parser.parse_args()    
file1 = args.infile1
file2 = args.infile2
print(file1)
print(file2)

# Define Compare funtion that joins on specified column

def merge_csvs():
    a = pd.read_csv(file1)
    b = pd.read_csv(file2)
    print(a)
    print(b)
    merged = b.merge(a, on='SWREV')
    merged.to_csv("merged_results.csv", index=False) 

# Define Diff fuction that diffs on specified column

def diff_csvs():

    s = open(file1, 'r')
    k = open(file2, 'r')
    print(s)
    print(k)
    checkS = csv.reader(s)
    checkK = csv.reader(k)

    output1 =  [row for row in checkS if row not in checkK]
    output2 =  [row for row in checkK if row not in checkS]

    with open("A_notin_B.csv", "w") as f:
        writer = csv.writer(f)
        writer.writerows(output1)

    with open("B_notin_A.csv", "w") as l:
        writer = csv.writer(l)
        writer.writerows(output2)

# Main Function that Calls all the other functions
def main():
    merge_csvs()
    diff_csvs()

main()

所以我摆脱了 arg_parser 函数,它使全局变量对其他函数可用