很抱歉,如果这是一个重复的帖子,但搜索似乎没有产生有用的results...or,也许我是一个菜鸟,我不明白什么是在回答。
我编写了这段用于实践的小代码(遵循“艰难学习Python的方法”)。我试图制作一个已经给我的代码的更短的版本。
from sys import argv
script, from_file, to_file = argv
# here is the part where I tried to simplify the commands and see if I still get the same result,
# Turns out it's the same 2n+2
trial = open(from_file)
trial_data = trial.read()
print(len(trial_data))
trial.close()
# actual code after defining the argumentative variables
in_file = open(from_file).read()
input(f"Transfering {len(in_file)} characters from {from_file} to {to_file}, hit RETURN to continue, CRTL-C to abort.")
#'in_data = in_file.read()
out_file = open(to_file, 'w').write(in_file)当使用len()时,它似乎总是返回2n+2值而不是n,其中n是文本文件中的实际字符数。我还确保文本文件中没有额外的行。
有人能解释一下吗?
提亚
我期望返回txt文件中的确切字符数。原来这要求太高了。
编辑:既然很多人都在要求一个实用的example....here,所以它说:
The poem
dedicated to Puxijn
The Chonk one我得到的是
ÿþT h e p o e m
d e d i c a t e d t o P u x i j n
T h e C h o n k o n e我认为这是一个编码问题。如果有任何帮助的话,我正在使用最新的python。
发布于 2022-11-17 21:01:44
根据您更新的问题,您肯定是使用语言环境默认编码从UTF-16编码文本文件中读取(可能是latin-1或cp1252,这两种编码都会将UTF-16 BOM解码为ÿþ;Windows通常使用cp1252作为默认值,而latin-1虽然在今天基本上被UTF-8所取代,但在较旧的UNIX上是一个流行的地区-很长时间以来都很喜欢)。这些编码将无错误地读取任何旧字节,即使编码错误(它们将所有256个字节映射为一个匹配的256个字符),产生胡言乱语(用于ASCII范围以外的字节)和奇怪的空白(对于UTF-16中每个ASCII字符之前的空字节)。
更改所有open调用以添加一个额外的参数,encoding='utf-16',例如:
trial = open(from_file, encoding='utf-16')Python将使用正确的文本编码将原始字节解码为str,并且所有长度都将匹配。
或者,当将文件保存在合理的编辑器中时,一定要调整编码,使其成为Python默认使用的编码(在现代Python中,不管地区设置如何,UTF-8可能是最流行的可移植编码,部分原因是对于纯ASCII文本,它与ASCII相同,不会浪费磁盘空间)。
发布于 2022-11-15 21:37:40
这些额外的字符可能是新的行字符,还是其他不可见的文本编辑器字符?
尝试只使用一个字符创建一个简单的测试文件。如跑
echo "a" > test_file此外,还有一个专用的bash命令来计算这些内容。
wc -m发布于 2022-11-15 21:42:33
观察到的行为与以二进制模式打开文件和用BOM以utf-16编码的文件是一致的。
如果然后对该文件的内容调用len,它将计算该文件中的字节数。字节的数量将取决于特定的编码。
这将解释两个2n原因,每utf-16字符有两个字节,以及+ 2,BOM换行符。
https://stackoverflow.com/questions/74452431
复制相似问题