Python的输入读取 sys.stdin与input对比

本文深入探讨Python中的标准化输入方法,对比sys.stdin与input的使用场景与差异,特别关注raw_input与sys.stdin.readline在处理换行符上的不同。通过具体代码示例,解析标准化输入在实际编程任务中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python中常用到的两种标准化输入方式:分别sys.stdin和input,两者使用方式大致相同,但是总的来说sys.stdin使用方式更加多样化一些,下面就例子说明两者之间的使用差别

input/raw_input 输入

input输入很简单,就是获得用户的输入,一般是在控制台界面

word=input('please input one or more word\n')
print (word)

运行之后就可以等待用户输入了,最终系统会认为回车键是输入的结束,接下来对输入做任何处理就是你自己的事情啦。

sys.stdin 输入

第一他也可以实现和input一样的功能,比如

import sys
print('please input one or more word\n')
word=sys.stdin.readline()
print (word)

但是,他更常见的是另外一种使用方式,可以直接使用文件作为整体的输入,可以很简洁。

import sys
print('please input one or more word\n')
word=sys.stdin.readline()
print (word)

使用方法,将文件重定向到输入中去就可以很方便的使用。
控制台中,比如:

$ python test.py < test.txt

关于raw_input( )和sys.stdin.readline( )的区别

之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:

import sys

line = sys.stdin.readline()

for i in range(len(line)):
    print line[i]+'hello'

它的运行结果让我百思不得其解:

123
1hello
2hello
3hello

hello
请按任意键继续。。。

怎么会多输出一个空行和hello?然后特意输出了line的长度,发现是4,然后重新调试了几次,发现无论输入什么,len(line)的长度总比输入的长度大1,然后用raw_input( )试着运行了一下,运行是正常的,然后查阅了一下文档,发现sys.stdin.readline( )会将标准输入全部获取,包括末尾的’\n’,因此用len计算长度时是把换行符’\n’算进去了的,但是raw_input( )获取输入时返回的结果是不包含末尾的换行符’\n’的

因此如果在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符,可以用strip( )函数去掉 sys.stdin.readline( ).strip('\n'),这样处理一下就行了。


其他等价写法

print 与 sys.stdout()

print 'hello' 等价于 sys.stdout.write('hello' + '\n') 输出并且显示,末尾有换行

raw_input 与 sys.stdin()

s = raw_input('请输入:') 等价于 print('请输入:') (可用上式替换)

s = sys.stdin.readline()值得注意的是:
在输入的后面可用split分割输入的字符串使之成为一个列表。例:s = sys.stdin.readline().split()
在输入的后面还可用 strip 去掉末尾空格。

Python 中 read() 和 readline() readlines() 区别

read():将文件一次全部读取成一个字符串,包括特殊字符,需要较大内存

readline():将文件根据换行符一行一行读取

readlines():将文件一次性读取到内存,依行为单位读取为一个列表对象

上述主要是进行标准化输入与获取,这一部分要和参数传递分清楚,其实Python最常用的就是参数传递也就是argpares模块sys模块


题目oj平台实例:

案例一:

输入描述:
第一行有三个整数N, M, K
接下来N行,每行M个整数为输入的矩阵

获取输入实现: 利用stdin

import sys
list_num = sys.stdin.readline().split()    #读取第一行,分割,即[ 'N', 'M', 'K' ]
N,M,K = [int(list_num[i]) for i in range(len(list_num))]    #对字符列表 int() 类型转化,得到 int
... ...
for i in range(N):
    line = sys.stdin.readline()    #依次遍历所有行,每行存入变量line进行处理
	... ...

案例二:

输入描述:
第一行一个整数N,表示数组长度
第二行N个整数,分别表示数组内的元素

获取输入实现: 利用input

length = int(input())    # 读取第一行 ['N'], int()转换得到 N
arr = list(map(int, input().split()))   # 读取第二行,map()操作每个元素int()转换,得到 int列表

案例三:

输入描述:
第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素

获取输入实现:

length, target = map(int, input().split())
arr = list(map(int, input().split()))

案例四:

输入描述:
第一行输入一个整数N,表示对栈进行的操作总数。

下面N行每行输入一个字符串S,表示操作的种类。
如果S为"push",则后面还有一个整数X表示向栈里压入整数X。
如果S为"pop",则表示弹出栈顶操作。
如果S为"getMin",则表示询问当前栈中的最小元素是多少。

获取输入实现:

# N = int(input())    也可以
N = int(sys.stdin.readline().strip())    #这里的去空格 都是保险操作,没有也行
for i in range(N):
	#command = sys.stdin.readline().split()    不用去空格也行
	command = sys.stdin.readline().strip()
	command = command.split()          # 每个command即 ["push/pop/getMin", "num"]

	command[0] == "push/pop/getMin"
	(int)command[1] ==  num
	... ...
<think>我们正在处理用户的问题:如何在Java中传递参数给Python脚本,并使用Pythonsys.stdin.read()读取。 根据用户的问题,我们需要解释两个部分: 1. Java如何调用Python脚本并传递数据(通过标准输入)。 2. Python脚本如何使用sys.stdin.read()读取这些数据。 步骤: 1. 在Java中,我们可以使用ProcessBuilder来启动一个外部进程(Python脚本),并将数据写入该进程的标准输入。 2.Python脚本中,我们使用sys.stdin.read()来读取从标准输入传入的所有数据。 注意:用户提到了使用sys.stdin.read(),因此我们将重点放在这种方法上。 具体步骤: Java端: - 创建ProcessBuilder对象,指定要执行的命令(如"python", "脚本路径")。 - 启动进程,并获取其输出流(Process.getOutputStream()),这个输出流对于Python进程来说就是标准输入。 - 向输出流写入数据(注意字符编码),并关闭输出流。 Python端: - 导入sys模块。 - 使用sys.stdin.read()读取所有输入数据(直到EOF)。 示例: Java代码示例: ```java import java.io.*; public class JavaToPython { public static void main(String[] args) throws IOException { // 设置Python命令和脚本 ProcessBuilder pb = new ProcessBuilder("python", "path/to/your_script.py"); Process process = pb.start(); // 获取进程的输出流(即Python的标准输入) OutputStream outputStream = process.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream)); // 写入数据到Python脚本 String data = "Hello from Java!"; writer.write(data); // 注意:必须刷新并关闭输出流,否则Python脚本可能一直等待输入结束 writer.flush(); writer.close(); // 如果需要,可以读取Python脚本的输出 InputStream inputStream = process.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { System.out.println("Python输出: " + line); } reader.close(); // 等待进程结束 try { int exitCode = process.waitFor(); System.out.println("Python脚本退出码: " + exitCode); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` Python脚本(your_script.py): ```python import sys # 读取所有标准输入数据 input_data = sys.stdin.read() # 处理数据(这里简单打印) print("Python收到数据: " + input_data) ``` 注意事项: - 在Java中,写入数据后必须关闭输出流(writer.close()),这样Python脚本才能读到EOF(文件结束符),否则sys.stdin.read()会一直等待。 - 字符编码问题:Java和Python默认的字符编码可能不同。建议在Java中写入时指定编码(如UTF-8),并在Python中如果需要也可以进行编码处理(但sys.stdin.read()读取的是字符串,所以Python读取时已经根据环境或设置进行了解码)。为了确保一致,可以在Java中指定编码,例如: new OutputStreamWriter(outputStream, StandardCharsets.UTF_8) 在Python中,如果环境变量或系统设置不一致,可能需要设置环境变量或使用其他方式确保编码一致。 另外,用户提供的引用中提到了关于缓冲区的讨论。在Python中,使用sys.stdin.read()会读取直到EOF,所以不需要担心行缓冲问题。但是,如果数据量很大,可能会遇到缓冲区大小限制。不过,一般情况下,sys.stdin.read()会读取所有输入直到结束。 根据引用[1]和[3],提到了缓冲区大小的问题。在用户的问题中,如果希望实时性更高,可能需要调整缓冲区大小,但通常对于一次性读取所有输入,使用read()是合适的。如果数据量非常大,可以考虑分块读取(如使用read(size)),但用户明确要求使用read(),所以这里不做分块处理。 因此,我们按照上述方式实现即可。 生成相关问题: 1. 如果数据量很大,如何分块读取标准输入? 2. Java调用Python脚本时如何传递命令行参数? 3. 如何确保Java和Python之间传输数据的编码一致? 4. 除了标准输入,还有哪些方式可以在Java和Python之间传递数据? 注意:用户的问题只涉及标准输入的方式,因此我们主要回答这个部分。 回答结构: 1. 解释Java如何调用Python并传递数据(通过标准输入)。 2. 给出Java代码示例。 3. 给出Python代码示例。 4. 强调注意事项(关闭流、编码等)。 5. 生成相关问题。</think>### Java 向 Python 传递参数并使用 `sys.stdin.read()` 读取 #### 实现原理 在 Java 中调用 Python 脚本时,可通过**标准输入流**传递数据。Python 的 `sys.stdin.read()` 会阻塞式读取所有输入直到 EOF(文件结束符)。Java 需通过 `ProcessBuilder` 启动 Python 进程,并向其输出流写入数据,该输出流对应 Python 的 `sys.stdin`。 #### Java 端代码示例 ```java import java.io.*; public class JavaToPython { public static void main(String[] args) throws IOException { // 1. 构建Python命令 ProcessBuilder pb = new ProcessBuilder("python", "your_script.py"); // 2. 启动进程并获取输出流 Process process = pb.start(); OutputStream stdin = process.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); // 3.Python传递数据 String data = "Hello from Java! 数据: 12345\n多行示例"; writer.write(data); writer.flush(); // 必须刷新缓冲区 writer.close(); // 关闭流触发EOF // 4. 读取Python的响应(可选) BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()) ); String line; while ((line = reader.readLine()) != null) { System.out.println("Python输出: " + line); } } } ``` #### Python 端代码示例 (`your_script.py`) ```python import sys def main(): # 读取所有标准输入数据 input_data = sys.stdin.read() print(f"Python收到数据: {input_data!r}") if __name__ == "__main__": main() ``` #### 关键注意事项 1. **流关闭触发 EOF** Java 必须调用 `writer.close()` 关闭输出流,否则 Python 的 `sys.stdin.read()` 会无限等待输入结束[^1]。 2. **字符编码处理** 若需处理二进制数据: ```python # Python读取二进制数据 input_bytes = sys.stdin.buffer.read() ``` Java 端需使用 `OutputStream` 直接写入字节。 3. **避免缓冲区问题** - Java 的 `flush()` 确保数据立即发送 - 大数据量时建议分块读写(如每 4KB 发送一次) 4. **多行字符串处理** Python 的 `sys.stdin.read()` 会保留换行符 `\n`,可直接按需分割: ```python lines = input_data.splitlines() ``` #### 执行结果示例 ``` Python输出: Python收到数据: 'Hello from Java! 数据: 12345\n多行示例' ``` ### 相关问题 1. 如何从 Python 向 Java 返回复杂数据结构(如 JSON)? 2. 大数据量传输时如何避免内存溢出? 3. 除了标准输入,还有哪些跨语言通信方式(如 Socket/共享内存)? 4. 如何处理 Java Python 间的异步通信? [^1]: 关闭输出流是触发 EOF 的必要条件,否则 `sys.stdin.read()` 会持续等待输入。 [^2]: `sys.stdin.read()` 一次性读取所有输入数据,包括换行符。 [^3]: 二进制数据需通过 `sys.stdin.buffer` 处理,避免编码问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值