处理后文件不可编辑和不可读(为什么?)

-4 投票
1 回答
996 浏览
提问于 2025-04-15 20:17

:) 我知道这看起来像是个很长的问题,但相信我,其实并不长。我现在无法弄清楚为什么处理完这个文本后,它就不能被读取和编辑了。我尝试用Python中的ord()函数来检查文本中是否包含除了ASCII字符以外的Unicode字符(非ASCII字符),结果发现有不少这样的字符。

输入文件:你可以把它复制粘贴到一个文件中,文件名为"acle5v1.txt"。

下面这段代码的目的是检查大写字母,并将其转换为小写,同时去掉所有标点符号,以便后续进行单词对齐处理。

#include<iostrea>
#include<fstream>
#include<ctype.h>
#include<cstring>

using namespace std;

ifstream fin2("acle5v1.txt");
ofstream fin3("acle5v1_op.txt");
ofstream fin4("chkcharadded.txt");
ofstream fin5("chkcharntadded.txt");
ofstream fin6("chkprintchar.txt");
ofstream fin7("chknonasci.txt");
ofstream fin8("nonprinchar.txt");

int main()
{
char ch,ch1;
fin2.seekg(0);
fin3.seekp(0);
int flag = 0;

            while(!fin2.eof())
    {
        ch1=ch;
        fin2.get(ch);

        if (isprint(ch))// if the character is printable
            flag = 1;

        if(flag)
        {
            fin6<<"Printable character:\t"<<ch<<"\t"<<(int)ch<<endl;
            flag = 0;
        }
        else
        {
            fin8<<"Non printable character caught:\t"<<ch<<"\t"<<int(ch)<<endl;
        }

        if( isalnum(ch) || ch == '@' || ch == ' ' )// checks for alpha numeric characters
        {
            fin4<<"char added: "<<ch<<"\tits ascii value: "<<int(ch)<<endl;
            if(isupper(ch))
            {
                //tolower(ch);
                fin3<<(char)tolower(ch);
            }
            else
            {
                fin3<<ch;
            }
        }
        else if( ( ch=='\t' || ch=='.' || ch==',' || ch=='#' || ch=='?' || ch=='!' || ch=='"' || ch != ';' || ch != ':') && ch1 != ' ' )
        {
            fin3<<' ';
        }
        else if( (ch=='\t' || ch=='.' || ch==',' || ch=='#' || ch=='?' || ch=='!' || ch=='"' || ch != ';' || ch != ':') && ch1 == ' ' )
        {
            //fin3<<" ';
        }
        else if( !(int(ch)>=0 && int(ch)<=127) )
        {
            fin5<<"Char of ascii within range not added: "<<ch<<"\tits ascii value: "<<int(ch)<<endl;
        }
        else
        {
            fin7<<"Non ascii character caught(could be a -ve value also)\t"<<ch<<int(ch)<<endl; 
        }   
    }
    return 0;
}

我有一段类似的Python代码,运行后输出的结果同样不可读且不可编辑。

这段Python代码看起来是这样的:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys

input_file=sys.argv[1]
output_file=sys.argv[2]

list1=[]

f=open(input_file)
for line in f:
    line=line.strip()   
    #line=line.rstrip('.')   
    line=line.replace('.','')
    line=line.replace(',','')
    line=line.replace('#','')
    line=line.replace('?','')
    line=line.replace('!','')
    line=line.replace('"','')
    line=line.replace('।','')
    line=line.replace('|','')       
    line = line.lower() 
    list1.append(line)
    f.close()

    f1=open(output_file,'w')

    f1.write(' '.join(list1))

    f1.close()

这个文件在运行时会接收输入和输出,如下:

python punc_remover.py acle5v1.txt acle5v1_op.txt

这个文件的输出结果保存在"acle5v1_op.txt"中。

现在,处理完这个特定的输出文件后,我需要它进行进一步处理。这个文件"acle5v1_op.txt"就是我无法使用的不可读和不可编辑的文件,我需要它来进行自然语言处理中的单词对齐。我尝试用以下程序读取这个输出文件:

#include<iostream>
#include<fstream>

using namespace std;

ifstream fin1("acle5v1_op.txt");
ofstream fout1("chckread_acle5v1_op.txt");
ofstream fout2("chcknotread_acle5v1_op.txt");

int main()
{
    char ch;
    int flag = 0;
    long int r = 0; long int nr = 0;

    while(!(fin1))
    {
        fin1.get(ch);

        if(ch)
        {
            flag = 1;
        }

        if(flag)
        {
            fout1<<ch;
            flag = 0;
            r++;
        }
        else
        {
            fout2<<"Char not been able to be read from source file\n";
            nr++;
        }
    }

    cout<<"Number of characters able to be read: "<<r;
    cout<<endl<<"Number of characters not been able to be read: "<<nr;

    return 0;
}

这个程序会打印出可读的字符,如果不可读则不打印。但我观察到两个文件的输出都是空白,因此我得出结论,这个文件"acle5v1_op.txt"确实是不可读和不可编辑的。你能帮我解决这个问题吗?

关于原始输入文件"acle5v1.txt"的一些统计信息,它大约有3441行,字符数大约有300万。

考虑到文件中的字符数量,你的编辑器可能无法打开这个文件。我在我当前使用的Fedora 10的gedit中能够打开这个文件。这只是想告诉你,至少在我这里,使用特定的编辑器并不是问题……

我可以使用像Python和Perl这样的脚本语言来解决这个问题吗?如果可以,请具体说明,因为我对Perl和Python还是个新手。或者你能告诉我如何用C++来解决这个问题吗?谢谢……:) 我真的很期待能得到一些帮助或指导,告诉我该如何处理这个问题……

1 个回答

2

(现在我可以回复了,因为花了一些时间编辑帖子。在发帖时,请使用预览功能并阅读帮助!)

没有什么问题是Python解决不了的……这个问题肯定也能用Python解决。

我稍微修改了一下你的Python脚本(缩进有点乱!),然后我能够处理你链接中复制的内容,输出结果还不错(不过还是有一些标点符号,比如':'和'()')。

你说在第一次处理后,输出结果是不可读和不可编辑的,但处理后的输出文件内容是什么呢?你有没有试着在编辑器中打开它,看看文件里有什么?如果第一步没有成功,那就先修正你的代码,集中精力解决这一部分的问题。可以试着用调试工具看看你的代码哪里出错了。

我个人怀疑是编码问题:你的输入文件是纯ASCII文件吗?还是说它可能是用Unicode编码的?

请注意,3MB的文件其实不算大。如果这对你造成了问题,那就换个编辑器吧!(可以试试jEdit、epsilon、emacs、vi……)

撰写回答