gpt4 book ai didi

python - 如何在Python中通过sys.stdin读取两个不同的文件

转载 作者:行者123 更新时间:2023-11-30 22:19:49 24 4
gpt4 key购买 nike

我想从 sys.stdin 读取两个不同的文件,我可以读取和写入文件,但第一个和第二个文件没有分离。

当我在 cmd win 10 和 python 3.6 上运行以下代码时:

D:\digit>cat s.csv s2.csv

结果是:

123451234567

I can print both files.

My python code is:

import sys 
import numpy as np

train=[]
test=[]

#Assume below code is function 1 which just and must read s.csv
reader = sys.stdin.readlines()
for row in reader:
train.append(int(row[0]))
train = np.array(train)

print(train)

#I need some thing here to make separation
#sys.stdin.close()
#sys.stdin = sys.__stdin__
#sys.stdout.flush()

#Assume below code is function 2 which just and must read s2.csv
reader = sys.stdin.readlines()
for row in reader:
test.append(int(row[0]))
test = np.array(test)

print(test)

我在 cmd 提示符下运行以下命令:

D:\digit>cat s.csv s2.csv | python pytest.py

结果是:

[1 2 3 4 5 1 2 3 4 5 6 7]
[]

我需要为下一个文件重置 sys.stdin 吗?我使用了以下内容,但没有一个是答案:

sys.stdin.close()
sys.stdin = sys.__stdin__
sys.stdout.flush()

提前感谢您提供的任何帮助。

最佳答案

让我尝试解释一下。

d:\digit>cat s.csv s2.csv

只有 1 个输出,而不是 2 个。它的作用是将 file1 的内容“流式传输”到 stdout,然后“流式传输”file2 的内容stdout没有任何暂停或分隔符!!

因此只有 1 个输出“流”,然后您可以使用 | 进行重定向。到你的 pyton 脚本:

| pytest.py

因此,pytest.py 将接收 1 个输入“流”,它不知道更好或更多。

如果你想通过pytest.py单独处理文件,可以执行以下操作

D:\digit>cat s.csv | python pytest.py # process the first file
D:\digit>cat s2.csv | python pytest.py # process the second file

或单行:

D:\digit>cat s.csv | python pytest.py && cat s2.csv | python pytest.py

请记住,pytest.py 实际上运行了两次。因此,您需要为此调整您的 python 脚本。

但是当你编辑 python 脚本时...

你应该做什么:如果您希望 pytest.py 中包含这两个文件,那么您应该编写一些代码来读取 python 脚本中的这两个文件。如果是csv结构化数据,那么看看csv module for reading and writing csv files

[根据评论进行编辑:]

I could read multiple files it by pandas "pd.read_csv" , but my problem is how can I do it by sys.stdin?

您真的应该质疑为什么您如此专注于使用 stdin。从 python 脚本中读取它可能会更有效。

如果您必须使用stdin,那么您可以部署各种但在Python外部的页眉、页脚、分隔符。一旦定义了这个并且能够执行此操作,您就可以更改 python 中的代码来执行各种功能,具体取决于从 stdin 接收到的页眉/页脚/分隔符。

这一切听起来有点复杂并且容易出错。我强烈建议您重新考虑使用 stdin 作为脚本的输入。或者,请使用您面临的限制您使用标准输入的技术要求和限制来更新您的问题。

[根据评论进行编辑:]

I want to load these files I Hadoop ecosystem and I am using Hadoop streaming for that

不知何故,您需要向您的 python 脚本发出“信号”,表明它正在处理带有新信息的新文件。

假设您有 2 个文件,第一行需要是某种指示文件的“ header ”,以及需要对其余数据执行哪个函数,直到收到新的“ header ”。

因此,假设您的“训练”数据以行 @is_train@ 为前缀,而您的“测试”数据以行 @is_test@ 为前缀

如何在您的环境中做到这一点,不属于此问题的范围

现在重定向到标准输入将在数据之前发送这两个 header 。你可以使用 python 来检查这些,例如:

import sys 
import numpy as np

train=[]
test=[]

is_train = False
is_test = False

while True:
line = sys.stdin.readline()
if '@stop@' in line:
break
if '@is_train@' in line:
is_train = True
is_test = False
continue
if '@is_test@' in line:
is_train = False
is_test = True
continue
#if this is csv data, you might want to split on ,
line = line.split(',')
if is_train:
train.append(int(line[0]))
if is_test:
test.append(int(line[0]))

test = np.array(test)
train = np.array(train)

print(train)
print(test)

正如您在代码中看到的,您还需要一个“页脚”来确定数据何时结束,在本例中选择了@stop@

发送页眉/页脚的一种方法可能是:

D:\digit>cat is_train.txt s.csv is_test.txt s2.csv stop.txt | python pytest.py

以及三个额外文件,仅包含适当的页眉或页脚

关于python - 如何在Python中通过sys.stdin读取两个不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48985922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com