我正在试图弄清楚我在循环中的评论是否正确。变量'device'会像我希望的那样是“列表列表”吗?如果是这样,我可以使用设备[0] [0]调用数据吗?或者,说我想要第三行和第二项,请使用设备[2] [1]?
def deviceFile():
devFile = raw_input('Enter the full file path to your device list file: \n-->')
open(devFile, 'r')
device = []
for line in devFile:
# creating an array here to hold each line. Call with object[0][0]
device.append(line.split(','))
return(device)
编辑:
def deviceFile():
'''This def will be used to retrieve a list of devices that will have
commands sent to it via sendCommands(). The user will need to supply
the full file path to the raw_input(). This file will need to be a csv,
will need to have column0 be the IP address, and column1 be the
hostname(for file naming purposes). If a hostname is not supplied in
column1, the file will be named with the IP address.'''
devFile = raw_input('Enter the full file path to your device list file: \n-->')
thisFile = open(devFile, 'r')
device = []
for line in thisFile:
# creating an array here to hold each line. Call with object[0][0]
device.append(line.split(','))
thisFile.close()
return(device)
这更像是“我在逻辑上这样做”,而不是“我的代码完美”类型的问题。我希望csv的每一行都是它自己的列表,并且能够通过在我的主程序中调用它来访问它:
devices = deviceFile()
machine = devices [0] [0]
返回第一行的第一项
machine = devices [2] [1]
返回第三行的第二项
答案 0 :(得分:0)
你的问题是你没有对文件对象(open
返回的东西)做任何事情,而是尝试对文件名进行操作,就像它是文件对象一样。所以,只需改变这一点:
devFile = raw_input('Enter the full file path to your device list file: \n-->')
open(devPath, 'r')
到此:
devPath = raw_input('Enter the full file path to your device list file: \n-->')
devFile = open(devPath, 'r')
一旦你这样做,它“有效”,但可能不符合你的预期。例如,对于此文件:
abc, def
ghi, jkl
你会得到这个:
[['abc', ' def\n'], ['ghi', ' jkl\n']]
'\n'
字符存在,因为for line in devFile:
返回保留换行符的行。如果你想摆脱它们,你必须做一些事情,比如rstrip('\n')
。
空间在那里,因为split
不会对空间做任何神奇的事情。您要求它在'abc, def'
上拆分','
,然后您将返回'abc'
和' def'
。如果你想摆脱它们,strip
结果。
您还有其他各种小问题 - 例如,您永远不会关闭文件 - 但它们都不会实际阻止您的代码工作。
所以:
def deviceFile():
devPath = raw_input('Enter the full file path to your device list file: \n-->')
devFile = open(devPath, 'r')
device = []
for line in devFile:
# creating an array here to hold each line. Call with object[0][0]
device.append([value.strip() for value in line.rstrip('\n').split(',')])
return(device)
现在你将退回:
[['abc', 'def'], ['ghi', 'jkl']]
device.append([value.strip() for value in line.rstrip('\n').split(',')])
看起来很复杂。在rstrip
之前调用每行split
并不是什么大问题,但是对每个值调用strip
的列表理解使得它有点难以阅读。如果你不知道列表理解是什么(看起来很可能,因为append
列表的device
周围有明确的循环),你必须做这样的事情:< / p>
device = []
for line in devFile:
values = []
for value in line.rstrip('\n').split(','):
values.append(value.strip())
device.append(values)
但是,有一种更简单的方法可以做到这一点。标准库中的csv
module使用换行符和空格来处理所有棘手的事情,以及您尚未想到的事情(如引用或转义值)。
def deviceFile():
devPath = raw_input('Enter the full file path to your device list file: \n-->')
with open(devPath) as devFile:
return list(csv.reader(devFile))
答案 1 :(得分:-1)
如果我错了,请纠正我,我认为您正在尝试读取文件,然后将文件中的每一行(用逗号分隔)存储到数组中。例如,如果你有一个简单地说“一,二,三”的文本文件,你想要创建一个数组['one','two','three']?如果是这样,你不需要for循环,只需这样做:
def deviceFile():
devFile = raw_input('Enter the full file path to your device list file: \n-->')
myFile = open(devFile, 'r') # Open file in read mode
readFile = myFile.read() # Read the file
# Replace enter characters with commas
readFile = readFile.replace('\n', ',')
# Split the file by commas, return an array
return readFile.split(',')
你不需要for循环的原因是因为str.split()已经返回一个数组。事实上,你甚至不需要附加“设备”,你根本不需要设备。有关详细信息,请参阅string documentation。