读取两个文本文件并使用两个文件中的值来调用Python中的API

时间:2018-03-20 16:26:06

标签: python file for-loop

我正在尝试读取两个文本文件,并使用两者中的值作为参数来调用API。我有效地解决了这个问题。

以下是相关代码:

def read_addresses(self):
    f = open("addresses.txt", "r")
    f2 = open("cities.txt", "r")
    self.addresses = f.readlines()
    self.cities = f2.readlines()


def get_data(self):

    for x in self.addresses:
        sep = '  Placeholder'
        self.k = x.split(sep, 1)[0]
        self.k = re.sub('\s+',' ', self.k)


    for x in self.cities:
        sep = '  Placeholder'
        self.j = x.split(sep, 1)[0]
        self.j = re.sub('\s+', ' ', self.j)
        self.city_state = self.j + ',' + ' TX'

        try:
            params = (
                ('address1', self.k
            ),
                ('address2', self.city_state),
            )

            print params

输入(cities.txt)

Unique City 1
Unique City 2
Unique City 3

输入(addresses.txt)

Unique Address 1
Unique Address 2
Unique Address 3

输出:

(('address1', 'Unique Address 3'), ('address2', 'Unique City 1 , TX'))
(('address1', 'Unique Address 3'), ('address2', 'Unique City 2 , TX'))
(('address1', 'Unique Address 3'), ('address2', 'Unique City 3, TX'))

我想要的输出:

(('address1', 'Unique Address 1'), ('address2', 'Unique City 1, TX'))
(('address1', 'Unique Address 2'), ('address2', 'Unique City 2, TX'))
(('address1', 'Unique Address 3'), ('address2', 'Unique City 3, TX'))

最有效的方法是什么?我想在一个for循环中完成。

2 个答案:

答案 0 :(得分:2)

您遇到的问题是,在您引用 self.k 之前,您的第一个for循环已完全运行。这样做是通过 self.addresses 进行迭代,并且每次都设置 self.k ,但是当您在下面的for循环中引用 self.k 时它只会保存列表中最后一个值的值,因为它不会同时迭代。

如果你想同时迭代这两个列表,你可以这样做

f = open("addresses.txt", "r")
f2 = open("cities.txt", "r")
self.addresses = f.readlines()
self.cities = f2.readlines()
for i,j in zip(self.addresses, self.cities):
    print i
    print j
    print (i, j)

这样您就不会遇到将self.k设置为列表中的最终值的问题。

另一方面,您可能需要考虑将其压缩为单个函数,并避免在不需要的情况下使用全局变量或类属性。这看起来像是不需要在类或类方法之间传递的临时数据。我建议一种方法,在单个函数中,您实例化并引用该函数范围内的变量,然后返回或打印所需的数据。祝你好运!

答案 1 :(得分:0)

你的任务 self.k 是第一个for循环的最后一个值。要获得所需的输出,您需要将self.k存储在每个迭代的列表中,例如k.append(..)

但是,在迭代2个列表时,我不知道你是如何通过单个for循环逃脱的。