如何通过文件列表循环迭代工具?
Posted
技术标签:
【中文标题】如何通过文件列表循环迭代工具?【英文标题】:How to loop itertools through a list of files? 【发布时间】:2018-04-27 03:52:06 【问题描述】:我设法为单个文件创建此文件以切分文件中的行。我只想取奇数。
filename = sys.argv[1]
filename2 = sys.argv[2]
with open(filename) as f:
items = itertools.islice(f, 0, None, 2)
x = (list(items))
final = "".join(x)
with open(filename2, 'a+') as bb:
bb.write(final)
以上代码运行良好。但我需要手动指定文件名。如果我有 100 个文件需要切片怎么办?
上面的代码输出示例。它将切/删除偶数上的线。
Input file
a
b
c
d
e
Output file
a
c
e
我正在考虑循环。到目前为止,这是我的解决方案。
# Directory where it contains my pat files.
mydir = "C:\\Users\\Desktop\\Scripts\\"
files = filter(lambda x: x.endswith('.pat'), os.listdir(mydir))
# print(list(files))
# ['filepat1.pat', 'filepat2.pat', 'filepat3.pat'.......]
i = 0
new_file = 'file.pat'.format(i)
for file in files:
with open(file) as f:
items = itertools.islice(f, 0, None, 2)
x = (list(items))
final = "".join(x)
#print(final)
for item in items:
i +=1
new_file = 'file.pat'.format(i)
with open(new_file, 'a+') as ww:
ww.write(final)
我的错误是什么?似乎它缺少循环。
【问题讨论】:
您遇到的错误是什么? 为什么要在a+
模式下打开文件只是为了从中读取?这意味着你总是什么也不读。在添加循环之前,您并没有在原始代码中这样做。
没有错误。但是文件没有被分割。所以我认为循环可能有问题。因为当调试打印“文件”时,列表是空的。
@abarnert 哦,我的错。它弄乱了复制和粘贴。我现在编辑它。但结果还是一样。
“文件没有被分割”是什么意思?你能把它减少到minimal reproducible example——可能是两个 5 行的输入文件,以及预期的和实际的输出吗?当我们甚至不知道问题是什么时,真的没有办法调试问题。
【参考方案1】:
如果我错了,请纠正我,但来自 for item in items:
的代码看起来很奇怪。据我了解,您正试图从一个文件中提取奇数行并将它们存储在一个新文件中,对吗?
你可以这样重写:
mydir = "C:\\Users\\Desktop\\Scripts\\"
files = filter(lambda x: x.endswith('.pat'), os.listdir(mydir))
#print(list(files))
for i, file in enumerate(files):
with open(file) as f:
items = itertools.islice(f, 0, None, 2)
x = (list(items))
final = "".join(x)
#print(final)
new_file = 'file.pat'.format(i)
with open(new_file, 'a+') as ww:
ww.write(final)
【讨论】:
这就是我想要的。感谢朋友的帮助:) 我已经修复了上面代码的小问题。以上是关于如何通过文件列表循环迭代工具?的主要内容,如果未能解决你的问题,请参考以下文章