怎么了?

时间:2018-12-15 11:15:59

标签: python python-3.x

我在观看youtube时很无聊,所以我开始编写基本的字符随机化程序。然后我想到了三个字母单词,它们具有36个不同的字符可供选择。

package stackedbar;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.StackedBarChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Label;

/**
 *
 * @author kuupie
 */
public class FXMLDocumentController implements Initializable {

    private Label label;
    @FXML
    private StackedBarChart<String, Number> chartBar;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        start();
    } 

public void start() {  
    // TODO Auto-generated method stub  
    //Configuring xaxis and yaxis   
    CategoryAxis xaxis = new CategoryAxis();  
    NumberAxis yaxis = new NumberAxis(1000,300000,1000);  
    xaxis.setLabel("Months");  
    yaxis.setLabel("Number of users");  

    //Configuring StackedBarChart   
    StackedBarChart chartBar = new StackedBarChart(xaxis,yaxis);  
    chartBar.setTitle("Popularity of Programming languages");  

    //Configuring series for java  
    XYChart.Series java = new XYChart.Series<>();  
    java.setName("java");  
    java.getData().add(new XYChart.Data<>("Jan",10000));  
    java.getData().add(new XYChart.Data<>("Jan",130000));  
    java.getData().add(new XYChart.Data<>("Feb",50000));  
    java.getData().add(new XYChart.Data<>("Mar",60300));  
    java.getData().add(new XYChart.Data<>("Apr",105600));  
    java.getData().add(new XYChart.Data<>("May",50600));  
    java.getData().add(new XYChart.Data<>("Jun",103000));  
    java.getData().add(new XYChart.Data<>("Jul",104500));  
    java.getData().add(new XYChart.Data<>("Aug",203000));  
    java.getData().add(new XYChart.Data<>("Sep",103400));  
    java.getData().add(new XYChart.Data<>("Oct",105600));  
    java.getData().add(new XYChart.Data<>("Nov",102400));  
    java.getData().add(new XYChart.Data<>("Dec",200000));  

    //Adding series java to the stackedbarchart  
    chartBar.getData().add(java);  

    //Configuring series python   
    XYChart.Series python = new XYChart.Series<>();  
    python.setName("python");  
    python.getData().add(new XYChart.Data<>("Jan",50000));  
    python.getData().add(new XYChart.Data<>("Jan",14300));  
    python.getData().add(new XYChart.Data<>("Feb",50400));  
    python.getData().add(new XYChart.Data<>("Mar",100500));  
    python.getData().add(new XYChart.Data<>("Apr",104000));  
    python.getData().add(new XYChart.Data<>("May",134000));  
    python.getData().add(new XYChart.Data<>("Jun",60000));  
    python.getData().add(new XYChart.Data<>("Jul",78000));  
    python.getData().add(new XYChart.Data<>("Aug",89000));  
    python.getData().add(new XYChart.Data<>("Sep",150000));  
    python.getData().add(new XYChart.Data<>("Oct",120000));  
    python.getData().add(new XYChart.Data<>("Nov",109450));  
    python.getData().add(new XYChart.Data<>("Dec",50450));  

    //adding python series to the stackedbarchart   
    chartBar.getData().add(python);  

    }      
}

此代码使我可以将46656或36 ^ 3三个字母单词,因为这是我正在使用多少个字符。奇怪的是,当它写入文件时,我得到如下信息: 〰ⱨ。为什么?这是什么?是Unicode吗? Python 3.5 BTW

2 个答案:

答案 0 :(得分:1)

  

是Unicode吗?

是的。但是您可能会惊讶地发现<div> 1 </div> "a"等都是也是 Unicode。

之所以会出现这些奇怪的字符,是因为您以两字节Unicode编码的文本打开或查看了输出文件。

您看到的某些代码超出了"b"范围,其中第一个代码是逗号,第二个代码是您的字母之一。例如,ⰶ是这样的:http://www.fileformat.info/info/unicode/char/2c36/index.htm。其他怪异字符也是通过将两个随机字符组合到一个双倍宽Unicode值中而形成的。

使用十六进制编辑器检查生成的文件,您确实可以得到预期的3个字母的组合,并用逗号分隔:

U+2C00

由于某种原因,您的文本文件查看器认为这应该是2字节Unicode文本。如果解决此问题,您将看到您的代码按预期工作。

答案 1 :(得分:0)

您错误地解释了unicode文件。您还可以稍微简化一下代码:

import random
from string import ascii_lowercase,digits
words = [] 
chars = ascii_lowercase+digits
for _ in range(10): # 46656 - reduced amount to 10 
    # words.append( random.choices(chars,k=3) ) # python 3.6 has choices
    words.append( [ random.choice(chars),random.choice(chars),
                    random.choice(chars)] )    # python 3.5 got no choices

words.sort()
with open("./ThreeLetters.txt","w+",encoding ="utf-8") as file:
    for w in words:
        file.write(str(w) + ",")

您可以像这样在控制台中打印文件而不会发生意外:

# and output it again            
with open("./ThreeLetters.txt", encoding ="utf-8") as f:
    print(f.read())

输出:

['1', '2', 'n'],['9', '6', 'f'],['j', 'o', 'k'],['n', '1', '4'],['n', 'o', '9'],['s', 'c', 'l'],['v', 'l', 'b'],['v', 'o', 'a'],['w', '7', 'u'],['z', '3', '6'],

我将文件写入固定为更本地化-距离顶部不远,并且还使用with open(..) as f:使文件更健壮。

请参阅: